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

4

我正在编写一些需要进行电子签名的内容。

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

作为解决方案的权宜之计,我想要做以下几件事情:

  1. 为用户创建一个公共/私有密钥对,使用单独的“签名”密码。
  2. 当我需要用户签署某些内容时,将明文与其他信息(如时间戳和其他参考信息)一起提供给用户,并让他们使用我存储的私钥进行签名。

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

  1. 用户通过SSL向我提交签名密码。我在服务器端生成私钥对,并在需要签名时暂时解锁私钥。我根本不存储密码,并尽快销毁已解锁的私钥。
  2. 用户使用JavaScript生成公/私钥。他们向我发送公钥和加密的私钥,并在本地存储中保留一份副本。当他们需要签署某些内容时,我会确保他们的本地存储中有它(如果没有,则进行推送),他们使用JS在本地解密和签署文本。我从未见过他们的签名密码或解锁的私钥。

无论哪种方式,我也会使用服务器密钥签署结果。但我需要一种用户唯一、不可抵赖的方式来签署文本,让他们拥有我维护的PGP密钥是最简单的方法。

选项1要简单得多,足以满足我的最低需求。

选项2要更加可靠,因为除非我篡改JS(我仍然可以这样做),否则我无法使用他们的私钥。

然而,为了实现它,我需要一个JavaScript库,它可以:

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

哪些库可以完成这个功能?

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

3个回答

4

很遗憾,他们在v5中更改了API并破坏了向后兼容性:( - Peter Kalef ' DidiSoft

1
我认为你的文章提出了错误的观点。例如,它说没有办法防止 math.RND() 被覆盖,但是这可以很容易地实现——在文件顶部编写带有内联 js 的 html 文件,在该代码中冻结 openpgp.js 依赖的每个对象。

Object.freeze()

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


1

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

如果您仍然相信JavaScript加密是您正在进行的工作的好主意,则:

PGP相当复杂,而您不需要其95%的功能。我建议您考虑使用Ed25519进行签名,它比RSA快得多,并且具有相同的安全性和更小的密钥。可以在http://www.flownet.com/ron/code/ed25519.js上找到JavaScript版本。它是基于椭圆曲线的系统。密钥非常小,事实上,您可以让用户选择“签名密码短语”,将其作为盐传递给scrypt[1],并将输出用作私钥(您只需要调整三个位即可使其成为有效的Ed25519私钥)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接