【问题标题】:Generating an RSA keypair in JavaScript在 JavaScript 中生成 RSA 密钥对
【发布时间】:2010-11-10 22:41:57
【问题描述】:

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

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

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

我很想对此进行一些讨论。我不是安全专家,但我对非对称加密有相当的把握。

【问题讨论】:

  • 您不能只使用 SSL 发送数据吗?它是安全的,更重要的是它对您来说是透明的,因此您无需在任何方面进行任何类型的加密/解密。
  • 也许我可以做 SSL。但是,如果我使用的主机不支持它怎么办?就个人而言,我不知道如何配置 SSL - 我在网上找到的所有东西都不是直截了当的。无论如何,SSL 与我的问题并不真正相关。

标签: javascript security encryption


【解决方案1】:

差不多 10 年前就有人问过这个问题,从那时起很多事情都得到了改善。目前,大多数现代浏览器都具有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"]
);

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • Diffie-Hellman 密钥交换听起来很有趣,我会研究一下。这是我发现的一个 javascript 实现的链接:enanocms.org/News:Article/2008/02/20/… 在非对称密钥对方面,一个强大的随机数生成器可以很容易地从另一种语言移植。与素数测试相同。我认为这在 javascript 中不会完全限制时间,尤其是在正确的后台线程运行它的情况下(当用户使用页面的其余部分时)。你知道我可以使用什么好的 C 风格的 RSA 密钥生成代码吗?
    • 我听说 Simson Garfinkel 关于 PGP 的书对代码(包括素性测试器)有很好的解释 - 使用各种快速方法,然后使用基于费马小定理的代码进行一些最终通过。您应该能够在一些旧的 PGP 源代码或任何 OpenPGP 或 gpg 实现中找到它。但是我想你会发现在Javascript中运行太慢了。
    猜你喜欢
    • 2012-06-24
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多