Ami*_*eth 2 openssl rsa sha256 digital-signature node.js
我想对node.js中的文件执行RSA-SHA512。我可以计算给定数据文件的sha512哈希值,该哈希值与openssl的匹配。但是,当尝试在同一哈希上获取数字签名时,node.js签名与openssl签名不同。以下是示例代码片段:
var data = new Buffer(512);
data = fs.readFileSync('/tmp/data');
var pem = fs.readFileSync('/tmp/boot2-prvKey.pem');
var privateKey = pem.toString('ascii');
var signer = crypto.createSign("RSA-SHA256");
signer.update(data);
var sign = signer.sign(privateKey, 'hex');
console.log("SIGN " + sign + '\n');
Run Code Online (Sandbox Code Playgroud)
Openssl命令对数据进行签名:
openssl rsautl -sign -in /tmp/data -inkey /tmp/boot2-prvKey.pem -out sig
Run Code Online (Sandbox Code Playgroud)
以上两种都生成不同的签名。
我有两个问题:1)我想计算文件的RSA-SHA256,因此我首先计算整个文件的sha256哈希,然后将此哈希作为输入传递给签名函数。那是正确的方法吗?2)如果是,那么上面的代码可能出了什么问题?如果没有,正确的方法是什么?
我正在使用的node.js版本是0.10.36,openssl版本是1.0,1。
当您向签名程序提供输入时,它可能会假设输入尚未进行哈希处理,因此将在签名之前对其进行哈希处理。这里的问题是Node正在(重新)哈希输入,而rsautl在按原样使用输入的。(请注意,即使您在将输入提供给之前单独重新哈希输入rsautl,由于rsautl不使用ASN1编码,它仍然不匹配;请参见下文。)
为了使OpenSSL在制作RSA签名之前会先生成SHA256哈希(就像Node一样),您需要dgst在-sha256和-sign参数:
openssl dgst -sha256 -sign /tmp/boot2-prvKey.pem -hex < /tmp/data
Run Code Online (Sandbox Code Playgroud)
这将对/tmp/dataRSA进行哈希处理并对其进行签名,这正是Node的RSA-SHA256签名者所做的。
看到 更多信息, openSSL rsautl与dgst之间的区别:
简单的答案是
dgst -sign创建一个哈希,ASN1对其进行编码,然后对ASN1编码的哈希进行签名,而rsautl -sign仅对输入签名而不进行哈希或ASN1编码。
Node sign方法的行为就像dgst -sign而不是rsautl -sign。
rsautl没有哈希和ASN1编码,Node似乎没有提供类似于签名的内置机制。因此,您可能需要直接对文档签名,而不是对文档的哈希值进行操作。如果由于某些原因您确实无法执行此操作,则可以从NPM下载Node rsautl模块,该模块为提供了Node绑定rsautl。
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |