4

我有一个前端为 HTML、Javascript 和后端为 Java 的应用程序,我需要使用 RSA 发送密码和敏感信息。我在javascript中使用JSEncrpt,在java中使用Bouncy castle。 我需要知道如何管理密钥。如果我在 javascript 中动态创建密钥,我如何将私钥发送到我的后端,反之亦然。我的 javascript 代码对用户可见,在 javascript 中存储私钥不是一种选择。

Javascript代码:

var text = "Hello World";
var privkey="MIICdQIB..........";
var pubkey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvFZQtGLPQKV0h....";

var encrypt = new JSEncrypt();
encrypt.setPublicKey(pubkey);
var ciphertext = encrypt.encrypt(text);
console.log("ciphertext  : " + base64ToHex(ciphertext));

var decrypt = new JSEncrypt();
decrypt.setPrivateKey(privkey);
var plaintext = decrypt.decrypt(hexToBase64(cipher));
console.log("plaintext  : " + plaintext);

对于 java 代码,请参见以下示例:http ://www.mysamplecode.com/2011/08/java-rsa-encrypt-string-using-bouncy.html

4

1 回答 1

0

对于 java 代码,请参见以下示例:http ://www.mysamplecode.com/2011/08/java-rsa-encrypt-string-using-bouncy.html

请注意,从可用性的角度来看,这个例子是错误的。RSA 本身旨在加密一小段信息(例如对称加密的密钥),而不是任何更长/更大的数据。看看混合密码系统。并且当使用较旧的 PKCS1.5 填充时,加密数据需要具有高熵。所以 - 不要将 RSA 与数据本身一起使用,而是使用混合密码系统(大多数高级库都会这样做)。

我需要双重加密

它增加了复杂性,但没有必要的安全性。

仅当您打算存储或重新发送加密数据时,才需要在 TLS (https) 之外加密数据。也许你会,只是我们看不到任何理由。

问题是 - RSA 旨在确保数据的完整性和机密性。TLS(基于 RSA 或椭圆曲线)还可以防止 MIM(中间人)攻击。如果您随机生成密钥而不检查验证身份的可能性(使用证书颁发机构),则 MIM(在 TLS 之后)是可行的。

我需要知道如何管理密钥。如果我在 javascript 中动态创建密钥,我如何将私钥发送到我的后端,反之亦然。

在非对称加密 (RSA) 中,发送者只需要目标的公钥来加密数据。并且要完成安全性,目标需要发送者的公钥来验证签名(如果消息已签名)

基本上,您可以生成一个随机(对称)加密密钥并使用 RSA 加密该密钥。然后客户端可以将IV(salt,与对称加密一起使用)、RSA加密的对称密钥、加密的数据(使用对称加密密钥)和MAC(消息验证码-哈希和签名)发送到另一端。

于 2018-07-30T10:56:07.640 回答