openSSL rsautl和dgst之间的区别

openSSL rsautl和dgst之间的区别,openssl,digital-signature,Openssl,Digital Signature,以下命令为输入文件生成签名: openssl dgst -sha1 -sign privateKey.pem -out signature1 someInputFile openssl dgst -binary -sha1 someInputFile > digest openssl rsautl -sign -in digest -inkey privateKey.pem -out signature2 以下命令还为输入文件生成签名: openssl dgst -sha1 -sign

以下命令为输入文件生成签名:

openssl dgst -sha1 -sign privateKey.pem -out signature1 someInputFile
openssl dgst -binary -sha1 someInputFile > digest
openssl rsautl -sign -in digest -inkey privateKey.pem -out signature2
以下命令还为输入文件生成签名:

openssl dgst -sha1 -sign privateKey.pem -out signature1 someInputFile
openssl dgst -binary -sha1 someInputFile > digest
openssl rsautl -sign -in digest -inkey privateKey.pem -out signature2
据我所知,他们都应该创建文件的SHA1摘要的RSA签名。但它们不会生成相同的签名

因此,使用方法2生成的签名也无法通过
openssl dgst-verify
调用进行验证


有人知道区别是什么,以及如何克服吗?

第一个。第二个。他们没有做同样的事情。

简单的答案是,
dgst-sign
创建一个散列,ASN1编码,然后对ASN1编码的散列进行签名,而
rsautl-sign
只对输入进行签名,而不进行散列或ASN1编码。这两种方法都将输入数据与签名一起包含在输出中,而不是仅生成一个签名作为输出。下面是一个Bash脚本,它显示了
openssldgst-sign
opensslrsautl-sign
之间的区别

#!/bin/bash
# @(#) Bash script demos difference between openssl rsautl and dgst signing
# Usage: $0 <name of file to sign> <private key file, without passphrase>

# 1. Make an ASN1 config file

cat >asn1.conf <<EOF
asn1 = SEQUENCE:digest_info_and_digest

[digest_info_and_digest]
dinfo = SEQUENCE:digest_info
digest = FORMAT:HEX,OCT:`openssl dgst -sha256 $1 |cut -f 2 -d ' '`

[digest_info]
algid = OID:2.16.840.1.101.3.4.2.1
params = NULL

EOF

# If you are wondering what the "algid = OID:2.16.840.1.101.3.4.2.1" is, it's
# the SHA256 OID, see http://oid-info.com/get/2.16.840.1.101.3.4.2.1

# 2. Make a DER encoded ASN1 structure that contains the hash and
# the hash type
openssl asn1parse -i -genconf asn1.conf -out $1.dgst.asn1

# 3. Make a signature file that contains both the ASN1 structure and
# its signature
openssl rsautl -sign -in $1.dgst.asn1 -inkey $2 -out $1.sig.rsa

# 4. Verify the signature that we just made and ouput the ASN structure
openssl rsautl -verify -in $1.sig.rsa -inkey $2 -out $1.dgst.asn1_v

# 5. Verify that the output from the signature matches the original
# ASN1 structure
diff $1.dgst.asn1 $1.dgst.asn1_v

# 6. Do the equivalent of steps 1-5 above in one "dgst" command
openssl dgst -sha256 -sign $2 -out $1.sig.rsa_dgst $1

# 7. Verify that the signature file produced from the rsautl and the dgst
# are identical
diff $1.sig.rsa $1.sig.rsa_dgst
#/bin/bash
#@(#)Bash脚本演示openssl rsautl和dgst签名之间的差异
#使用费:0美元
# 1. 创建一个ASN1配置文件

谢谢你的回答,@ansur。但据我所知,创建数字签名与使用私钥加密哈希相同。在第一种方法中,我指定要使用的SHA1哈希,以及用于签名哈希的私钥,与第二种方法相同。你知道第一种方法和第二种方法有什么不同吗?中提供了正确答案。M'vy显示,
rsautl-sign
在输出签名文件中包含输入文件的加密内容(在您的例子中是摘要)。要只进行原始RSA签名,请使用
openssl pkeyutl
,如@JonathanBen Avraham excellent,Jonathan中所述。你能不能提供一个答案,然后我可以接受。这很好!但是在步骤2和步骤3中创建的asn1文件包含文件的sha256摘要(
$0
),而不是整个签名。
pkeyutl-sign-pkeyopt摘要:$hash
(从2010年1.0.0开始提供)要简单得多。或者查看PKCS1=rfc2437/rfc3447/rfc8017中的前缀常量。