在Node.JS的加密模块中使用公钥验证签名

12

有没有一种好的方法,可以使用公钥在Node.JS (v0.4+)中验证签名?

当前的crypto模块允许使用证书进行验证,但不支持使用公钥。例如:

var crypto = require("crypto");

verifier = crypto.createVerifier("sha1");
verifier.update("signed data");
verifier.verify(CERT, signature);

变量CERT需要签名证书(我猜公钥是从中提取的),但我只有公钥,没有证书。

唯一可靠的方法似乎是将数据、公钥和签名的内容转储到文件中,并执行openssl dgst

fs.writeFileSync("public.key", pubkey);
fs.writeFileSync("sig.sha1", signature);
fs.writeFileSync("data.txt", data);
exec("openssl dgst -sha1 -verify public.key -signature sig.sha1 data.txt", ...)

但是每次需要验证签名时都创建(和删除)文件似乎是一种完全浪费。

有什么好的想法可以更好地完成这项任务吗?

更新于2011-08-03

Node.js v0.5中的加密模块允许使用证书和公钥(RSA或X.509)进行验证(传送门)


我相信 OpenSSL 是可行的选择。它是否允许你实时流式传输值,还是必须使用文件?你打算多久进行一次操作? - jcolebrand
经常,但不是很频繁。我可以接受这个解决方案,但它感觉非常不对,特别是与更优雅的crypto.verifier相比。我宁愿不使用文件。 - Andris
我想将公钥作为第一个参数传递,但我不确定它应该是b64编码的字符串、用'----BEGIN KEY----'和'-----END KEY----'包装的字符串,还是new Buffer(the_string,'base64')。我尝试了所有这些方法,但加密仍在寻找证书。如何告诉它我正在直接传递公钥? - Ustaman Sangat
我使用了 -----BEGIN PUBLIC KEY---- 和 ----END PUBLIC KEY----,因为我在从私钥PEM中提取公钥时看到openssl输出了这些内容,这样错误消息就消失了。 - Ustaman Sangat
1
我尝试在Node 0.8中使用Crypto模块来完成这个任务...但失败了。你似乎更成功,能否发布一些代码? - iandotkelly
1个回答

1

能否使用公钥生成证书?所有的示例都是使用私钥而不是公钥。 - Andris
所有的例子都涉及到一对2个密钥,1个私钥和1个公钥。当您创建CSR时,CSR包含一个证书,而证书包含一个公钥。这里有一个更清晰的文档,说明“genrsa”实际上生成了一对连接的密钥,1个公钥和1个私钥。http://www.openssl.org/docs/HOWTO/keys.txt。第一段:“使用OpenSSL,私钥也包含公钥信息,因此不需要单独生成公钥。” - Peter Lyons

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