当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');