我有一个应用程序,前端为 HTML、Javascript,后端为 Java, 我需要使用 RSA 来发送密码和敏感信息。我在 javascript 中使用 JSEncrpt,在 java 中使用 Bouncy caSTLe。 我需要知道如何管理 key 。如果我在 javascript 中动态创建 key ,我如何将私钥发送到我的后端,反之亦然。我的 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
最佳答案
and for java code see example on : http://www.mysamplecode.com/2011/08/java-rsa-encrypt-string-using-bouncy.html
请注意,从可用性的 Angular 来看,这个例子是错误的。 RSA 本身旨在加密小块信息(例如对称加密的 key ),而不是任何更长/更大的数据。看看hybrid cryptosystem .当使用较旧的 PKCS1.5 填充时,加密数据需要具有高熵。所以 - 不要对数据本身使用 RSA,而是使用混合密码系统(大多数高级库都会这样做)。
I need double encryption
它增加了复杂性,但没有必要的安全性。
仅当您打算存储或重新发送加密数据时,才需要在 TLS (https) 之外加密数据。也许您会这样做,只是我们看不到任何理由。
问题是 - RSA 旨在确保数据的完整性和 secret 性。 TLS(基于 RSA 或椭圆曲线)也可以防止 MIM(中间人)攻击。如果您随机生成 key 而不检查验证身份的可能性(使用证书颁发机构),则 MIM(在 TLS 之后)是可行的。
I need to know how can I manage keys. If I create keys dynamically in javascript how can I send private key to my backend or vice-versa.
在非对称加密 (RSA) 中,发件人只需要目标的公钥来加密数据。为了确保安全,目标需要发件人的公钥来验证签名(如果消息已签名)
基本上,您可以生成随机(对称)加密 key 并使用 RSA 加密该 key 。然后客户端可以将 IV(salt,与对称加密一起使用)、RSA 加密的对称 key 、加密数据(使用对称加密 key )和 MAC(消息认证码 - 哈希和签名)发送到另一端。
关于javascript - javascript中的RSA加密和Java中的解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51492213/