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

Generating PGP keypair, and signing text with an encrypted PGP private key, in Javascript

本文关键字:PGP 文本 私钥 加密 Javascript 密钥对      更新时间:2023-09-26

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

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

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

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

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

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

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

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

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

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

  1. 生成发布/隐私密钥对
  2. 解密私钥以供使用
  3. 使用该私钥对文本块进行签名

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

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

看看 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 私钥(。

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

我认为你的文章声称错误的东西。例如,它说,没有办法阻止例如数学。RND(( 被覆盖 - 但它可以很容易地完成 - 在文件顶部使用内联 js 编写 html 文件。在该代码中,您冻结了OpenPGP所依赖的每个对象.js。

Object.freeze((

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