我有一个应用程序,其前端为HTML,Javascript,后端为Java, 我需要使用RSA发送密码和敏感内容。我在javascript中使用JSEncrpt,在Java中使用Bouncy城堡。 我需要知道如何管理密钥。如果我在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
答案 0 :(得分:0)
有关Java代码,请参见以下示例:http://www.mysamplecode.com/2011/08/java-rsa-encrypt-string-using-bouncy.html
请注意,从可用性角度来看,此示例是错误的。 RSA本身的目的是加密一小部分信息(例如用于对称加密的密钥),而不是任何更长/更大的数据。看看hybrid cryptosystem。当使用较旧的PKCS1.5填充时,加密数据需要具有较高的熵。因此-不要将RSA本身与数据一起使用,而应使用混合密码系统(大多数高级库都可以这样做)。
我需要双重加密
它增加了复杂性,但没有必要的安全性。
仅当您打算存储或重新发送加密的数据时,才需要在TLS(https)外部加密数据。也许您愿意,只是我们看不到任何理由。
问题是-RSA旨在确保数据的完整性和机密性。 TLS(基于RSA或椭圆曲线)还可以防御MIM(中间人)攻击。如果您随机生成密钥而不检查是否有可能(使用证书颁发机构)验证身份,则MIM(位于TLS后面)是可行的。
我需要知道如何管理密钥。如果我在javascript中动态创建密钥,如何将私钥发送到后端,反之亦然。
在非对称加密(RSA)中,发送方只需要目标的公钥即可加密数据。为了确保安全性,目标服务器需要发送者的公钥来验证签名(如果邮件已签名)
基本上,您可以生成随机(对称)加密密钥并使用RSA加密密钥。然后,客户端可以将IV(盐,用于对称加密),RSA加密的对称密钥,加密的数据(具有对称加密密钥)和MAC(消息身份验证代码-哈希和签名)发送到另一端。