我最近发现了这个RSA JavaScript库:http://www.ohdave.com/rsa/。但是,它需要预先生成密钥。以下是我的问题:
我想在JavaScript中生成一个RSA密钥对(这样我每次想要一个新的密钥对时都不必更改代码。)
虽然我理解如何使用它来发送安全数据,但如果我没有弄错,这个库不能用于客户端从服务器接收安全数据(因为公共和私人指数,以及模数,从服务器传输纯文本)。我错了吗?
我喜欢对此进行一些讨论。我不是安全专家,但我对非对称加密非常掌握。
答案 0 :(得分:1)
生成密钥对需要一个强大的随机数生成器(我不认为你在JavaScript中有一个),以及相当多的计算(用于素性测试)。然后,一旦你拥有了你的对,当你将公钥传送到另一方时,由于没有对公钥传输进行完整性检查,因此中间人攻击有机会。
您将获得安全传输给拥有私钥的人。从您的问题不清楚这是客户端还是服务器。您可以通过让只有公钥的人生成共享密钥来初始化共享密钥,对其进行加密并将其发送给拥有公钥的任何人。
您可以获得类似的功能集(依赖于随机数生成器,对MITM的漏洞,创建共享密钥以用作会话密钥的能力),但通过执行Diffie-Hellman密钥交换来实现更少的计算。
最好不要弄清楚如何在服务器上配置SSL。
答案 1 :(得分:1)
这个问题已经问了差不多十年了,从那时起,许多事情都得到了改善。当前,大多数现代浏览器都具有Web Crypto API功能,该功能提供了生成强随机数的功能,因此允许脚本生成加密密钥,签名数据,验证签名,加密和解密数据以及其他加密操作。
以下是上述MDN的示例代码:
let keyPair = window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["encrypt", "decrypt"]
);