在JavaScript中生成RSA密钥对

在JavaScript中生成RSA密钥对,javascript,security,encryption,Javascript,Security,Encryption,我最近发现了这个RSA JavaScript库:。但是,它要求预先生成密钥。以下是我的问题: 我想在JavaScript中生成一个RSA密钥对(这样我就不必在每次需要新密钥对时都更改代码) 虽然我了解如何使用该库发送安全数据,但如果我没有弄错的话,该库不能用于客户端从服务器接收安全数据(因为公共和私有指数以及模数是从服务器以纯文本传输的)。我弄错了吗 我想讨论一下这个问题。我不是安全专家,但我对非对称加密有着相当坚定的理解 生成密钥对需要一个强大的随机数生成器(我认为JavaScript中没有)

我最近发现了这个RSA JavaScript库:。但是,它要求预先生成密钥。以下是我的问题:

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

  • 虽然我了解如何使用该库发送安全数据,但如果我没有弄错的话,该库不能用于客户端从服务器接收安全数据(因为公共和私有指数以及模数是从服务器以纯文本传输的)。我弄错了吗


  • 我想讨论一下这个问题。我不是安全专家,但我对非对称加密有着相当坚定的理解

    生成密钥对需要一个强大的随机数生成器(我认为JavaScript中没有),并且需要大量计算(用于素性测试)。然后,一旦您拥有一对,当您将公钥传输到另一端时,就有机会进行中间人攻击,因为公钥传输没有完整性检查

    你将得到安全传输给任何拥有私钥的人。从您的问题中不清楚这是客户机还是服务器。您可以通过让只有公钥的人生成共享密钥,对其进行加密并将其发送给拥有公钥的人来初始化共享密钥

    您可以获得类似的功能集(依赖于随机数生成器、对MITM的漏洞、创建用作会话密钥的共享密钥的能力),但通过执行Diffie-Hellman密钥交换,计算量要少得多


    您最好弄清楚如何在服务器上配置SSL。

    这个问题在大约10年前就被提出了,从那时起,很多事情都得到了改进。目前,大多数现代浏览器都具有生成强随机数的功能,因此允许脚本生成加密密钥、签名数据、验证签名、加密和解密数据以及其他加密操作

    以下是来自上述MDN的示例代码:

    let keyPair = window.crypto.subtle.generateKey(
      {
        name: "RSA-OAEP",
        modulusLength: 4096,
        publicExponent: new Uint8Array([1, 0, 1]),
        hash: "SHA-256"
      },
      true,
      ["encrypt", "decrypt"]
    );
    

    您不能使用SSL发送数据吗?它是安全的,更重要的是它对你来说是透明的,所以你不需要在任何方面做任何类型的加密/解密。也许我可以做SSL。但是如果我使用的主机不支持它呢?就我个人而言,我不知道如何配置SSL——我在网上找到的所有东西都不是直截了当的。无论如何,SSL与我的问题并不相关。Diffie-Hellman密钥交换听起来很有趣,我将对此进行研究。我发现了一个javascript实现的链接:就非对称密钥对而言,一个强大的随机数生成器可以很容易地从另一种语言移植。素性测试也是如此。我不认为这在javascript中是完全禁止时间的,特别是在有正确的后台线程运行它的情况下(当用户使用页面的其余部分时)。你知道我可以使用什么好的C型RSA密钥生成代码吗?我听说Simson Garfinkel关于PGP的书对该代码有很好的解释,包括素性测试仪-使用各种快速方法,然后使用基于Fermat小定理的代码进行最后的传递。您应该能够在一些旧的PGP源代码或任何OpenPGP或gpg实现中找到它。但是我想你会发现在Javascript中运行太慢了。