我正在尝试使用 Node.js 加密模块来验证某些数据的签名。我正在使用 Node.js 0.8.0。
文件中的数据已使用 MD5 算法进行哈希处理,并使用私有 RSA 密钥进行签名,并将签名保存到单独的文件中。这一切都是使用 Java 库完成的。
如果我使用 openssl 来验证签名是否成功,请使用:
openssl dgst -verify mykey.pem -signature example.sig hello.txt
它以 响应Verified OK
。如果我更改 hello.txt 的单个字符,它不会验证。我可以在上面的命令中添加一个 -MD5 参数,它仍然可以工作,但我认为这是默认设置,但如果我说 -MD4 或 -SHA 它不会验证。这一切都很好。
如果我随后尝试使用包装 openssl 的 Node 加密模块,我将无法进行此验证。
我的示例代码是:
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 作为摘要算法
- 加载base64编码的签名而不是二进制,并将'base64'参数放在验证函数上。
我是否误解了我的代码正在执行与我在这里显示的 openssl 命令行相同的操作?有关如何解决此问题的任何建议?
更新:我也尝试过使用自签名的可信证书,而不仅仅是密钥。我已经确认 openssl 验证证书,但节点加密库不验证文件。