Gui*_*ido 12 java encryption encryption-asymmetric
此代码生成一对公钥/私钥:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair keypair = keyGen.genKeyPair();
PrivateKey privateKey = keypair.getPrivate();
PublicKey publicKey = keypair.getPublic();
Run Code Online (Sandbox Code Playgroud)
我想知道的是你通常如何存储公钥:
选项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);
Run Code Online (Sandbox Code Playgroud)
我不喜欢的是将代码绑定到具体的实现,如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);
Run Code Online (Sandbox Code Playgroud)
第二种选择更容易实现,但我不知道它是否会降低性能.
有什么建议吗?
Bri*_*arr 13
在我们的应用程序中,我们以DER格式存储公钥和私钥,因此可以更容易地在java之外使用和操作它们.在我们的例子中,私钥没有密码.
要将私钥转换为更容易在java中使用的东西:
openssl pkcs8 -topk8 -nocrypt -in key.pem -inform PEM -out key.der -outform DER
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过以下方式直接获取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;
}
Run Code Online (Sandbox Code Playgroud)
公钥类似:
openssl rsa -in private.pem -pubout -outform DER -out public.der
Run Code Online (Sandbox Code Playgroud)
并阅读它:
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;
}
Run Code Online (Sandbox Code Playgroud)
许多人存储密钥库.出于我们的目的,我们需要在多种不同语言的多个应用程序之间共享相同的密钥,并且不希望在磁盘上复制文件.
在任何一种情况下,性能都不应该是一个巨大的问题,因为您可能会将这些键存储在某种Singleton或缓存中,而不是每次都重新生成它们.
| 归档时间: |
|
| 查看次数: |
16241 次 |
| 最近记录: |