2011-06-02 98 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