我想在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');
Openssl命令对数据进行签名:
openssl rsautl -sign -in /tmp/data -inkey /tmp/boot2-prvKey.pem -out sig
以上两者都会产生不同的签名 .
我有几个问题1)我想计算一个文件的RSA-SHA256,所以我首先计算整个文件的sha256哈希值并将此哈希值作为输入传递给签名函数 . 这是正确的方法吗? 2)如果是,上面的代码可能出错了什么?如果不是,那么正确的做法是什么?
我使用的node.js版本是0.10.36,openssl版本是1.0,1 .
2 回答
当您向签名程序提供输入时,它可能会假定输入尚未进行哈希处理,并在签名之前对其进行哈希处理 . 这里的问题是Node(重新)散列输入,而
rsautl
正在使用输入 . (请注意,即使您在将输入提供给rsautl
之前单独重新散列输入,它也会匹配,因为rsautl
不使用ASN1编码;请参阅下文 . )要使OpenSSL在制作RSA签名之前生成SHA256哈希(如Node所做的那样),您需要将
dgst
命令与-sha256
和-sign
参数一起使用:这将散列
/tmp/data
并使用RSA签署散列,这正是Node的RSA-SHA256
签名者所做的 .有关更多信息,请参阅Difference between openSSL rsautl and dgst:
Node的
sign
方法的行为类似于dgst -sign
而不是rsautl -sign
.Node似乎没有提供内置的
rsautl
-like机制,无需散列和ASN1编码即可进行签名 . 因此,您可能需要直接签署文档,而不是对文档的哈希进行操作 . 如果由于某种原因你真的不能这样做,你可以下载Node rsautl module from NPM,它为rsautl
提供节点绑定 .问题是您的Openssl命令只是在没有哈希函数的情况下签署您的数据 . 您必须首先使用openssl散列数据并使用与nodejs代码(SHA-256)中相同的函数,然后使用您的命令对散列进行签名以获取最终签名:
openssl rsautl -sign -in /tmp/data -inkey /tmp/boot2-prvKey.pem -out sig
您可以在此命令中看到您没有指定任何哈希函数 .
要获取签名:data - > SHA-256 = hash - > RSA = signature
我没有足够的时间来测试它并给你正确的代码,我希望它会有所帮助 .