【发布时间】:2020-07-30 15:25:06
【问题描述】:
我正在为通过 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;
}
我现在有以下问题:
- 这样做的方法是否正确?
如果我在这里使用受信任的证书,如何从中获取公钥?会以同样的方式获取吗?和私钥?我会使用相同的方法或证书中的内容吗?
如何将我的证书分发给接收者?为此,安全通信应该是什么?
我是加密新手,很高兴得到一些建议。
【问题讨论】:
-
1.是的,但是您可以从密钥库中获取公钥,如 Javadoc 中所示:只需从 PrivateKeyEntry 获取证书并从中获取公钥。 2. 同样的方式。 3. 你需要一个离线机制。你不能通过它打算保护的机制来运输它。
-
感谢您的回复,请问我应该使用 CA 还是自签名?
-
如果您对 (3) 有一个好的解决方案,您可以使用自签名,但 CA 证书消除了这种需要。
-
好的,可以说,我要使用自签名证书;那么我的代码是否可以满足解决方案,即获取密钥?
-
您遗漏了关键细节。你从来没有在你的问题中提到过 ssl,它只是作为你的标签之一出现。您将从混合加密的摘要开始。这是否意味着您没有使用 SSL,而是编写自己的自定义安全协议?另一个关键考虑因素是客户的性质。客户端软件只是标准的网络浏览器吗?如果是这样,那么您应该使用商业 ca。另一方面,如果您的客户是您编写的应用程序,那么使用商业 ca 的几乎所有好处都将消失,而自签名证书可能是可行的方法。
标签: java ssl encryption