我正在通过RSA和AES的结合为文件加密做一个解决方案。RSA主要用于握手,加密对称密钥,并通过密钥对在接收端解密。
我为私钥使用了Java密钥存储库,为公钥使用了自签名证书.这两种方法的创建如下:
密钥存储
keytool -genkey -keyalg RSA -alias BANK -keystore receiverKeystore.jks -validity 360 -keysize 2048证书导出
keytool -export -alias BANK -keystore receiverKeystore.jks -rfc -file bankCert.cer同样,这两种方法在Java中都使用,如下所示:
私钥
private void setKeys() {
KeyStore senderKeyStore = null;
String keyStorePassword = "fms123";
try {
senderKeyStore = KeyStore.getInstance( "JKS" );
FileInputStream is = new FileInputStream( keystorePath );
senderKeyStore.load( is, keyStorePassword.toCharArray() );
senderPrivateKey = ( PrivateKey ) senderKeyStore.getKey( KEYSTORE_ALIAS, keyStorePassword.toCharArray() );
receiverPublicKey = loadReceiverPublicKeyFromCertificate();
}
catch ( Exception e ) {
System.out.println( " Exception in setting keys from key store = " + e );
}
} 公钥
private PublicKey loadReceiverPublicKeyFromCertificate () {
PublicKey publicKey = null;
try {
FileInputStream fin = new FileInputStream( certificateFilePath );
CertificateFactory factory = CertificateFactory.getInstance( "X.509" );
X509Certificate certificate = ( X509Certificate ) factory.generateCertificate( fin );
publicKey = certificate.getPublicKey();
}
catch ( Exception e ) {
System.out.println( " Exception in loading receiver certificate = " + e );
}
return publicKey;
}我现在有以下问题:
我对加密是新手,会很高兴得到一些建议。
发布于 2020-04-17 12:15:16
你的握手被称为密钥建立。握手是用于(在线)交通方式的,我不认为你在发展这种方式。我会使用PKCS#12密钥存储,而不是JKS。使用char[]作为密码的整个想法是,您可以在使用它之后直接删除它的内容,所以使用String作为输入不是一个好主意。字符串通常是内部的,并且在Java中总是不可变的,所以如果没有涉及本机代码的丑陋的黑客,就无法销毁它们。
受信任的证书与不受信任的证书没有什么不同。是的,你可以从里面取回公钥。私钥通常与导致私钥所属的叶用户证书的证书链一起存储。但是,私钥是,而不是证书的一部分,因此不能从它检索私钥。不过,这是可以的,私钥应该建立在需要私钥的位置;除了备份之外,不需要传输私钥。
如何将证书发送给接收方取决于您。棘手的部分是让接收方信任证书。使用预先建立的密钥(如可信的PGP密钥)是有效的。如果你没有这样的钥匙,那你就有麻烦了。您可以做的是使用其他方法来建立信任。让对方打电话给您,然后验证证书指纹(基本上只是证书上的散列)是否正确,这可能是最简单的方法之一。当然,如果你的用户离你不远,亲自带过来也是一种选择。
不过,你不能凭空创建一个安全的通道。如果你不能信任对方,那么建立完全信任显然是不可能的。
https://stackoverflow.com/questions/61266333
复制相似问题