2011-06-02 99 views
11

是否有一种验证Node.JS(v0.4 +)中使用公钥的签名的好方法?使用公钥验证Node.JS中的签名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", ...) 

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

任何好主意如何做得更好?

UPDATE 2011-08-03

在Node.js的V0.5加密模块允许验证both with certificates and public keys(RSA或X.509)

+0

嗯,我很确定openssl是要走的路。它会让你流中的值或必须该应用程序使用文件?你多久会这样做? – jcolebrand 2011-06-02 17:50:40

+0

定期,但不是很经常。我可以接受这个解决方案,但它感觉错了,尤其是与更加优雅的加密验证程序相比。我不想使用文件。 – Andris 2011-06-02 18:01:56

+0

我想传递一个公钥作为第一个参数,但我不确定它是否应该是b64编码的字符串,用'---- BEGIN KEY ----'和'----- END KEY ----'或新的缓冲区(the_string,'base64')。我尝试了所有,但加密仍在寻找CERTIFICATE。如何判断我是直接传递公钥? – 2012-04-09 23:27:58

回答

1

你为什么不只是把你的公钥和把它放到自签名证书中?那么节点的加密模块对你来说可以很好地工作。

http://www.akadia.com/services/ssh_test_certificate.html

我认为这样做是远远超过分叉的OpenSSL的子流程更高效。

+0

是否可以使用公钥生成证书?所有的例子都使用私钥而不是公钥。 – Andris 2011-07-08 08:30:32

+0

所有示例都涉及一对2个密钥,1个私人密钥,1个公共密钥。创建CSR时,CSR包含证书,并且证书包含公钥。这是一个更清晰的文件,“genrsa”实际上生成一对连接的密钥,1个公共密钥和1个私有密钥。 http://www.openssl.org/docs/HOWTO/keys.txt。第一段:“对于OpenSSL,私钥也包含 公钥信息,因此公钥不需要分别生成 。” – 2011-07-08 16:24:18