在Javascript中生成PGP密钥对,并使用加密的PGP私钥对文本进行签名

时间:2012-05-18 03:43:57

标签: javascript encryption cryptography pgp openpgp

我正在写一些needs to do electronic signatures

有些用户会像我这样的极客,并且已经拥有自己的PGP密钥。大多数人不会,也不会想要安装或维护它。

作为一种解决方案,我想执行以下操作:

  1. 为使用单独“签名”密码的用户创建公钥/私钥对。
  2. 当我需要用户签名时,请向用户提供明文,以及其中的一些其他信息,如时间戳和其他参考,并让他们使用我存储的私钥对其进行签名。
  3. 基本上有两种方法(对于没有自己的PGP密钥的用户)。

    1. 用户通过SSL向我提交签名密码。我生成私钥对服务器端,并在需要签名时暂时解锁私钥。我根本不存储密码,我尽快摆脱未锁定的私钥。
    2. 用户在Javascript中生成pub / priv密钥。他们向我发送了pubkey和加密的私钥,并将副本保存在本地存储中。当他们需要签名时,我确保他们的本地存储有它(如果不是,则推送),他们使用JS在本地解密和签名文本。我从未看到他们的签名密码或他们未锁定的私钥。
    3. 无论哪种方式,我也用服务器的密钥签署结果。但我需要有一个用户独特的,不可否认的方式让用户也可以签署文本,让他们拥有一个PGP密钥,我保持这是最简单的方法。

      选项1要做得更简单,并且能够很好地满足我的最低需求。

      选项2更值得信赖,除非我颠覆了JS(我仍然可以做到),否则我不能自己使用他们的私钥。

      但是,为了做到这一点,我需要一个可以

      的JavaScript库
      1. 生成pub / priv密钥对
      2. 解密私钥以供使用
      3. 使用该私钥签署一个文本块
      4. 哪些图书馆可以做到这一点?

        P.S。请注意,我不需要加密到给定的公钥。我需要用户使用他们自己的(加密存储的)密钥签名

3 个答案:

答案 0 :(得分:4)

查看http://openpgpjs.org - 它应该已经实现了您正在寻找的大部分功能。

答案 1 :(得分:3)

首先,请阅读这篇文章:http://www.matasano.com/articles/javascript-cryptography/

如果你仍然确信javascript加密对你正在做的事情是一个好主意,那么:

PGP相当复杂,你不需要它的95%,我建议你考虑使用Ed25519进行签名 - http://www.flownet.com/ron/code/ed25519.js提供了一个javascript版本。它是一个基于椭圆曲线的系统,比RSA快得多,具有相同的安全性和更小的密钥。事实上,密钥非常小,您可以让用户选择“签名密码短语”,将其作为salt以scilpt [1]的形式提供给他们,并将输出用作私钥(您只需要frob三位使其成为有效的Ed25519私钥)。

  1. https://github.com/cheongwy/node-scrypt-js

答案 2 :(得分:1)

我认为你的文章声称错误。 例如,它说,没有办法阻止例如math.RND()被覆盖 - 但它可以很容易地完成 - 在文件顶部用内联js编写html文件。 在那段代码中你冻结了每个对象,openpgp.js取决于。

Object.freeze()

所以你可以建立一个安全的环境。确实! 使用ssl传输index.html, 冻结重要的东西,防止加载其他js文件, 确保不允许与其他服务器的连接等等。