Node.js Openssl和Node';s加密有不同的输出
简而言之,我想在节点中使用Node.js Openssl和Node';s加密有不同的输出,node.js,openssl,cryptography,Node.js,Openssl,Cryptography,简而言之,我想在节点中使用crypto库对字符串(“a”)进行签名,就像openssl一样。但我一次又一次地得到错误的输出 长描述 使用openssl签名 我有两个生成的rsa密钥:public key.pem和private key.pem,它们是我用openssl制作的: $ openssl genrsa 2048 > private-key.pem $ openssl rsa -in private-key.pem -pubout >public-key.pem 当我在she
crypto
库对字符串(“a”
)进行签名,就像openssl
一样。但我一次又一次地得到错误的输出
长描述
使用openssl签名
我有两个生成的rsa密钥:public key.pem
和private key.pem
,它们是我用openssl制作的:
$ openssl genrsa 2048 > private-key.pem
$ openssl rsa -in private-key.pem -pubout >public-key.pem
当我在shell中键入这些命令时:
$ echo "a" | openssl dgst -sha256 -sign private-key.pem >signature_openssl.bin
它生成一个名为siganture\u openssl.bin
的文件
节点加密签名
const crypto=require('crypto'))
常量符号=crypto.createSign('SHA256')
常量fs=require('fs')
const privateKey=fs.readFileSync('./private-key.pem','utf8')
签名。写(“a”)
结束()
让res=sign.sign(privateKey,'binary')
fs.writeFileSync('./signature_node.bin',res',binary')
此块生成名为signature\u node.bin
的文件
验证生成的二进制文件
要验证生成的签名,我需要执行以下操作:
$ echo "a" | openssl dgst -sha256 -signature signature_openssl.bin -verify public-key.pem
Verified OK
但节点未验证:
$ echo "a" | openssl dgst -sha256 -signature signature_node.bin -verify public-key.pem
Verification Failure
问题是:我做错了什么 在节点中,您对一个由字母a组成的字符串进行了签名,但在OpenSSL中,您都进行了签名,并试图验证一个由字母a加换行符组成的字符串。这是不同的数据,签名的目的是验证相同的数据,而不是不同的数据。假设是非古代Unix,请尝试使用printf%s“a”
(在本例中实际上不需要引号,但在其他情况下可能需要引号)。PS:您以两种不同的方式拼错了签名
文件名,但我认为这只是发布中的一个错误,您的实际文件是正确的。@dave_thompson_085谢谢您解决了我的问题。如果你回答这个问题,我会接受它作为正确答案。除非你想换行,否则使用echo-n
。或者,在Node.js代码中添加新行。在Linux上,换行符是LF
。另见.、等。