4

我正在写一些需要做电子签名的东西。

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

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

  1. 为使用单独的“签名”密码的用户创建一个公钥/私钥对。
  2. 当我需要用户签署某些东西时,向用户提供明文以及其中的一些其他信息,例如时间戳和其他引用,并让他们使用我存储的私钥对其进行签名。

基本上有两种方法可以做到这一点(对于没有自己的 PGP 密钥的用户)。

  1. 用户通过 SSL 向我提交签名密码。我在服务器端生成私钥对,并在需要签名时临时解锁私钥。我根本不存储密码,我尽快摆脱解锁的私钥。
  2. 用户在 Javascript 中生成 pub/priv 密钥。他们将公钥和加密私钥发送给我,并在本地存储中保留一份副本。当他们需要签署某些东西时,我确保他们的本地存储有它(如果没有,则推送),他们使用 JS 在本地解密和签署文本。我从来没有看到他们的签名密码,也没有看到他们解锁的私钥。

无论哪种方式,我还使用服务器的密钥对结果进行签名。但我也需要有一种用户唯一的、不可否认的方式让用户签署文本,并且让他们拥有我维护的 PGP 密钥是最简单的方法。

选项 1 操作起来要简单得多,并且可以很好地满足我的最低需求。

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

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

  1. 生成一个 pub/priv 密钥对
  2. 解密私钥以供使用
  3. 使用该私钥签署一段文本

哪些图书馆可以做到这一点?

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

4

3 回答 3

4

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

于 2013-01-14T06:28:46.317 回答
1

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

如果您仍然相信 javascript crypto 是您正在做的事情的好主意,那么:

PGP 相当复杂,您不需要 95% 的功能,我建议您改为考虑使用 Ed25519 进行签名 - javascript 版本可在 http://www.flownet.com/ron/code/ed25519获得.js。这是一个基于椭圆曲线的系统,比 RSA 快得多,具有同等的安全性和更小的密钥。事实上,密钥是如此之小,以至于您可以让用户选择一个“签名密码”,将其提供给 scrypt[1],并将其用户 ID 作为盐,并将输出用作私钥(您只需要frob 三位使其成为有效的 Ed25519 私钥)。

  1. https://github.com/cheongwy/node-scrypt-js
于 2012-05-18T04:12:57.113 回答
1

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

对象.freeze()

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

于 2013-08-19T17:30:56.480 回答