首页 文章

node.js加密签名和openssl签名不匹配

提问于
浏览
2

我想在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 回答

  • 4

    当您向签名程序提供输入时,它可能会假定输入尚未进行哈希处理,并在签名之前对其进行哈希处理 . 这里的问题是Node(重新)散列输入,而 rsautl 正在使用输入 . (请注意,即使您在将输入提供给 rsautl 之前单独重新散列输入,它也会匹配,因为 rsautl 不使用ASN1编码;请参阅下文 . )

    要使OpenSSL在制作RSA签名之前生成SHA256哈希(如Node所做的那样),您需要将 dgst 命令与 -sha256-sign 参数一起使用:

    openssl dgst -sha256 -sign /tmp/boot2-prvKey.pem -hex < /tmp/data
    

    这将散列 /tmp/data 并使用RSA签署散列,这正是Node的 RSA-SHA256 签名者所做的 .

    有关更多信息,请参阅Difference between openSSL rsautl and dgst

    简单的答案是dgst -sign创建一个哈希,ASN1对其进行编码,然后对ASN1编码的哈希进行签名,而rsautl -sign只是在没有哈希或ASN1编码的情况下对输入进行签名 .

    Node的 sign 方法的行为类似于 dgst -sign 而不是 rsautl -sign .

    Node似乎没有提供内置的 rsautl -like机制,无需散列和ASN1编码即可进行签名 . 因此,您可能需要直接签署文档,而不是对文档的哈希进行操作 . 如果由于某种原因你真的不能这样做,你可以下载Node rsautl module from NPM,它为 rsautl 提供节点绑定 .

  • 0

    问题是您的Openssl命令只是在没有哈希函数的情况下签署您的数据 . 您必须首先使用openssl散列数据并使用与nodejs代码(SHA-256)中相同的函数,然后使用您的命令对散列进行签名以获取最终签名: openssl rsautl -sign -in /tmp/data -inkey /tmp/boot2-prvKey.pem -out sig

    您可以在此命令中看到您没有指定任何哈希函数 .

    要获取签名:data - > SHA-256 = hash - > RSA = signature

    我没有足够的时间来测试它并给你正确的代码,我希望它会有所帮助 .

相关问题