当openssl命令行执行时,Node.jsvalidation函数不validation签名

我正在尝试使用Node.jsencryption模块来validation某些数据的签名。 我正在使用Node.js 0.8.0。

文件中的数据已经使用MD5algorithm进行哈希处理,并使用专用RSA密钥进行签名,并将签名保存到单独的文件中。 这一切都是使用Java库完成的。

如果我使用openssl来validation签名,这是成功的,使用:

openssl dgst -verify mykey.pem -signature example.sig hello.txt 

它以“ Verified OK响应。 如果我更改hello.txt的单个字符,它不validation。 我可以添加一个-MD5参数到上面的命令,它仍然工作,但我认为这是默认的,但如果我说-MD4或-SHA它不validation。 这很好。

如果我然后尝试使用包装openssl的节点encryption模块,我不能得到此validation工作。

我的示例代码是:

 var crypto = require("crypto"); var fs = require("fs"); var data = fs.readFileSync("./hello.txt"); var pubkey = fs.readFileSync("./mykey.pem", "utf8"); var signature = fs.readFileSync("./example.sig"); var verifier = crypto.createVerify ('RSA-MD5'); verifier.update (data); var success = verifier.verify (pubkey, signature); console.log(success); 

这总是输出false 。 我努力了:

  • 读取数据为'utf8'和'ascii'编码,因为它是一个文本文件。
  • 读密钥为'ascii'编码(我有理由认为关键是罚款,因为我正在加载一个不正确的编码密钥的一些例外时,
  • 使用MD5而不是RSA-MD5作为摘要algorithm
  • 加载一个base64编码的签名而不是二进制,并将'base64'参数放在validation函数上。

我误解我的代码是执行相同的操作,我在这里显示的openssl命令行? 任何build议如何解决这个问题?

更新:我也尝试使用自签名可信证书而不是仅仅一个密钥。 我已经确认opensslvalidation证书,但节点encryption库不validation文件。

我终于发现这是一个签名格式问题 – validation有第三个参数,当我有'hex'格式时,默认为'二进制'。

最终的解决scheme转移到使用SHA1散列,现在在节点0.10上运行,该节点具有略微不同的streamAPI,但相关行已更改为:

 result = verifier.verify(publicKey, signature, 'hex');