当前位置: 首页 > 面试题库 >

Java非对称加密:存储公钥/私钥的首选方法

闽鸿宝
2023-03-14
问题内容

此代码生成一对公钥/私钥:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair keypair = keyGen.genKeyPair();
PrivateKey privateKey = keypair.getPrivate();
PublicKey publicKey = keypair.getPublic();

我想知道的是您通常如何存储公钥:

选项1:存储字节

byte[] privateKeyBytes = privateKey.getEncoded();
byte[] publicKeyBytes = publicKey.getEncoded();
// ... write to file

// convert bytes back to public/private keys
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);

我不喜欢将代码绑定到诸如PKCS8EncodedKeySpec和的具体实现X509EncodedKeySpec

选项2:存储模数和指数

KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(publicKey, RSAPublicKeySpec.class);
RSAPrivateKeySpec priv = fact.getKeySpec(privateKey,RSAPrivateKeySpec.class);

// store modulus and exponent as BigIntegers
BigInteger modulus = pub.getModulus());
BigInteger exponent = pub.getPublicExponent());
// ... write to file

// recreate public key (the same applies to the private key)
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(keySpec);

第二个选项更易于实现,但是我不知道它是否可能性能较低。

有什么建议吗?


问题答案:

在我们的应用程序中,我们以DER格式存储公钥和私钥,以便可以在Java外部更轻松地使用和操纵它们。在我们的情况下,私钥上没有密码。

要将私钥转换为在Java中更容易使用的东西:

openssl pkcs8 -topk8 -nocrypt -in key.pem -inform PEM -out key.der -outform DER

然后,您可以通过以下方式直接获取RSA私钥:

public static RSAPrivateKey getPrivateKey(File privateKeyFile) throws IOException, GeneralSecurityException {
    byte[] keyBytes = new byte[(int)privateKeyFile.length()];
    FileInputStream fis = new FileInputStream(privateKeyFile);
    fis.read(keyBytes);
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(spec);
    return privKey;
}

公钥类似于:

openssl rsa -in private.pem -pubout -outform DER -out public.der

并阅读:

public static RSAPublicKey getPublicKey(File publicKeyFile) throws IOException, GeneralSecurityException {
    byte[] keyBytes = new byte[(int)publicKeyFile.length()];
    FileInputStream fis = new FileInputStream(publicKeyFile);
    fis.read(keyBytes);
    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    RSAPublicKey pubKey = (RSAPublicKey)factory.generatePublic(publicKeySpec);
    return pubKey;
}

然后很多人存储密钥库。出于我们的目的,我们需要在多个应用程序中以几种不同的语言共享同一密钥,并且不想复制磁盘上的文件。

在这两种情况下,性能都不是一个大问题,因为您可能会将这些密钥存储在某种Singleton或缓存中,而不是每次都重新生成它们。



 类似资料:
  • 本文向大家介绍Java生成非对称型加密公钥和私钥的方法,包括了Java生成非对称型加密公钥和私钥的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java生成非对称型加密公钥和私钥的方法。分享给大家供大家参考。具体如下: 非对称型加密非常适合多个客户端和服务器之间的秘密通讯,客户端使用同一个公钥将明文加密,而这个公钥不能逆向的解密,密文发送到服务器后有服务器端用私钥解密,这样就做到了明

  • 我知道这很难...但我使用OpenSSL以一种非常标准的方式加密文件。该文件使用RSA-2048公钥在AES-256中加密。我想在Java中使用私钥解密文件。我研究了很长时间,尝试了很多方法,但似乎都行不通。我只是找到相关的问题与工作的解决方案,但不是确切地为我的问题。 我使用以下命令生成public-/private-key-pair:

  • 我已经在Java中设置了公钥和私钥加密,并分发了两个用户的公钥(通信是在两个用户之间)。我现在希望用户交换一个对称密钥。我应该做的: 用户A生成密钥。 用户A用他的私钥加密密钥,然后用B的公钥加密。 用户A发送加密密钥。 用户B接收加密密钥。 用户B先用他的私钥解密密钥,然后用A的公钥解密密钥。 用户A生成密钥的我的代码: 第8行抛出以下错误: 非常感谢任何帮助。多谢了。

  • 我看到钥匙和mModulas是相等的,有人知道吗?

  • 在SpringBoot中有一个“rest-server” 服务在某个地方安装了许多Java中的“rest-clients”。我不控制它。 “rest-server”为每个(!)生成公钥/私钥对客户端并与客户端共享pub密钥 每个“Rest-Client”生成自己的公钥/私钥对,并与“Rest-Server”共享公钥。客户端共享其公钥和唯一ID。 “Rest-Clients”不时轮询“”Rest-S

  • 您可以在AWS KMS中创建非对称密钥对(加密/解密)。当前AWS CLI允许访问公钥(https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/get-public-key.html) 我无法在Terraform的KMS资源中看到这一点。是我错过了什么还是这只是在最新版本中还没有,