当 openssl 命令行验证签名时,节点.js验证函数不会验证签名
Node.js verify function does not verify signature when openssl command line does
我正在尝试使用Node.js加密模块来验证某些数据的签名。 我正在使用节点.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的节点加密模块,则无法使此验证正常工作。
我的示例代码是:
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验证了证书,但节点加密库没有验证该文件。
我终于发现这是一个签名格式问题 - verify 有第三个参数,当我使用"十六进制"格式时,它默认为"二进制"。
最终解决方案转向使用 SHA1 哈希,现在在节点 0.10 上运行,该节点的流 API 略有不同,但已更改的相关行是:
result = verifier.verify(publicKey, signature, 'hex');
相关文章:
- JS验证ajax返回的html中的表单数据
- 正在删除node.js中已验证的网站
- 用于验证JS中逻辑运算符表达式的正则表达式
- 如何在Node.js中根据XML验证DTD
- 扩展验证.js并验证单个元素
- 为什么 MVC4 验证 js 自动将数字验证添加到日期时间
- IF 语句验证.js
- 如何按类名查找标签以跳过 jQuery 表单中的验证.js
- Facebook Javascript SDK Security.Facebook 如何验证 JS SDK 是否已加载到
- 使用主干验证.js在没有视图的模型上
- 关于验证.js使用函数
- 用于验证JS代码的API/库/工具
- 解决正则表达式问题;验证js
- 如何验证js弹出窗口中的regexp值何时在capybara/cucumber中可见
- 如何验证JS和PHP之间的连接
- 不使用PHP的HTML验证JS
- 有没有任何方法可以在ruby on rails应用程序中验证JS上电子邮件的唯一性
- MVC3 中的自定义验证.js文件
- 对节点中的请求进行身份验证.js针对 Wordpress
- 在multier文件上传器中验证JS中的多个图像格式