在JavaScript中生成RSA密钥对

时间:2009-07-15 09:16:37

标签: javascript security encryption

我最近发现了这个RSA JavaScript库:http://www.ohdave.com/rsa/。但是,它需要预先生成密钥。以下是我的问题:

  1. 我想在JavaScript中生成一个RSA密钥对(这样我每次想要一个新的密钥对时都不必更改代码。)

  2. 虽然我理解如何使用它来发送安全数据,但如果我没有弄错,这个库不能用于客户端从服务器接收安全数据(因为公共和私人指数,以及模数,从服务器传输纯文本)。我错了吗?

  3. 我喜欢对此进行一些讨论。我不是安全专家,但我对非对称加密非常掌握。

2 个答案:

答案 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"]
);