在Javascript中生成PGP密钥对,并使用加密的PGP私钥对文本进行签名
Generating PGP keypair, and signing text with an encrypted PGP private key, in Javascript
我正在写一些需要做电子签名的东西。
有些用户会像我一样是极客,并且已经拥有自己的PGP密钥。大多数人不会,也不想安装或维护它。
作为解决方法,我想执行以下操作:
- 为使用单独"签名"密码的用户创建公钥/私钥对。
- 当我需要用户对某些内容进行签名时,请向用户提供明文,以及其中的一些其他信息,如时间戳和其他引用,并让他们使用我存储的私钥对其进行签名。
基本上有两种方法可以做到这一点(对于没有自己的PGP密钥的用户(。
- 用户通过 SSL 向我提交签名密码。我生成私钥对服务器端,并在需要签名时临时解锁私钥。我根本不存储密码,并且尽快摆脱了解锁的私钥。
- 用户在 Javascript 中生成 pub/priv 密钥。他们向我发送公钥和加密的私钥,并将副本保存在本地存储中。当他们需要签名时,我确保他们的本地存储有它(如果没有,则推送(,他们使用 JS 在本地解密和签名文本。我从未看到他们的签名密码或解锁的私钥。
无论哪种方式,我都会使用服务器的密钥对结果进行签名。但是我也需要一种用户唯一、不可否认的方式来签署文本,让他们拥有我维护的 PGP 密钥是最简单的方法。
选项 1 操作起来要简单得多,并且效果很好,足以满足我的最低需求。
选项 2 更值得信赖,因为除非我颠覆 JS(我仍然可以这样做(,否则我自己不能使用他们的特权。
但是,为了做到这一点,我需要一个可以
- 生成发布/隐私密钥对
- 解密私钥以供使用
- 使用该私钥对文本块进行签名
哪些图书馆可以做到这一点?
附言请注意,我不需要加密到给定的公钥。我需要用户使用自己的(加密的存储(密钥进行签名。
看看 http://openpgpjs.org - 它应该已经实现了您正在寻找的大部分功能。
首先,阅读这篇文章: http://www.matasano.com/articles/javascript-cryptography/
如果你仍然相信javascript crypto对于你正在做的事情来说是一个好主意,那么:
PGP 相当复杂,您不需要它所做的事情的 95%,我建议您考虑使用 Ed25519 进行签名 - javascript 版本可在 http://www.flownet.com/ron/code/ed25519.js 中找到。这是一个基于椭圆曲线的系统,比RSA快得多,具有同等的安全性和更小的密钥。事实上,密钥非常小,您可以让用户选择一个"签名密码",以他们的用户 ID 作为盐将其提供给 scrypt[1],并使用输出作为私钥(您只需要冻结三位即可使其成为有效的 Ed25519 私钥(。
- https://github.com/cheongwy/node-scrypt-js
我认为你的文章声称错误的东西。例如,它说,没有办法阻止例如数学。RND(( 被覆盖 - 但它可以很容易地完成 - 在文件顶部使用内联 js 编写 html 文件。在该代码中,您冻结了OpenPGP所依赖的每个对象.js。
Object.freeze((
因此,您可以构建一个安全的环境。传输索引.html使用 SSL ,冻结重要内容,防止加载其他JS文件,确保不允许连接到其他服务器等。
- 如何使用jquery在填充自动完成的值后使文本框只读
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 用程序搜索JQuery数据表中的文本
- jQuery匹配JSON对象的部分文本
- onkeyup无法动态创建多个文本区域
- 如何在下面的ES6循环中获得前面的文本
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 让文本输入幻灯片显示输入时的新文本输入?然后向后滑动
- 借助asp.net验证或java脚本对多个文本进行验证
- 无法在ajaxStart中更改跨度文本
- 高亮显示时编辑文本大小和颜色
- jquery中的文本框验证
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- Sails.js:同时发布文本输入和一个文件
- 当鼠标悬停在文本中的单词上时显示警报
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 将纯文本URL转换为可单击链接
- 如何使用nodes和.createElement(“b”)将文本加粗
- 在Javascript中生成PGP密钥对,并使用加密的PGP私钥对文本进行签名