繁体   English   中英

当openssl命令行执行时,Node.js验证函数不验证签名

[英]Node.js verify function does not verify signature when openssl command line does

我正在尝试使用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的节点加密模块,我无法使此验证工作。

我的示例代码是:

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'参数放在verify函数上。

我是否误解了我的代码执行的操作与我在此处显示的openssl命令行相同? 有关如何解决此问题的任何建议?

更新:我还尝试使用自签名的可信证书而不仅仅是密钥。 我已经确认openssl验证了证书,但节点crypto库没有验证该文件。

我终于发现它是一个签名格式问题 - verify有第三个参数,当我使用'hex'格式时默认为'binary'。

最终解决方案转移到使用SHA1哈希,现在在节点0.10上运行,该节点具有稍微不同的流API,但相关的更改行是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM