openssl dgst(生成和验证数字签名)

Posted liliyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了 openssl dgst(生成和验证数字签名)相关的知识,希望对你有一定的参考价值。

该伪命令是单向加密工具,用于生成文件的摘要信息,也可以进行数字签名,验证数字签名

首先要明白的是,数字签名的过程是计算出数字摘要,然后使用私钥对数字摘要进行签名,而摘要是使用md5、sha512等算法计算得出的(而通过私钥加密摘要信息得到数字签名),理解了这一点,openssl dgst命令的用法就完全掌握了。

openssl dgst [-md5|-sha1|...] [-hex | -binary] [-out filename] [-sign filename] [-passin arg] [-verify filename] [-prverify filename] [-signature filename]   [file...]

选项说明:

file...:指定待签名的文件。

-hex:以hex格式输出数字摘要。如果不以-hex显示,签名或验证签名时很可能乱码

-binary:以二进制格式输出数字摘要,或以二进制格式进行数字签名。这是默认格式

-out filename:指定输出文件,若不指定则输出到标准输出。

-sign filename:使用filename中的私钥对file数字签名。签名时绝对不能加-hex等格式的选项,否则验证签名必失败,亲测。

 -signature filename:指定待验证的签名文件

-verify filename:使用filename中的公钥验证签名。

-prverify filename:使用filename中的私钥验证签名。

-passin arg:传递解密密码。若验证签名时实用的公钥或私钥文件是被加密过的,则需要传递密码来解密。

支持如下几种单向加密算法,即签名时使用的hash算法。

-md4            to use the md4 message digest algorithm

-md5            to use the md5 message digest algorithm

-ripemd160      to use the ripemd160 message digest algorithm

-sha            to use the sha message digest algorithm

-sha1           to use the sha1 message digest algorithm

-sha224         to use the sha224 message digest algorithm

-sha256         to use the sha256 message digest algorithm

-sha384         to use the sha384 message digest algorithm

-sha512         to use the sha512 message digest algorithm

-whirlpool      to use the whirlpool message digest algorithm

注意:openssl dgst -md5和openssl md5的作用是一样的,其他单向加密算法也一样,例如openssl dgst -sha等价于openssl sha。

例如:

(1).随机生成一段摘要信息(即单向加密)

[[email protected] ~]# echo 123456 | openssl md5
(stdin)= f447b20a7fcbf53a5d5be013ea0b15af

(2).对/tmp/a.txt文件生成MD5和sha512摘要信息。

[[email protected] ~]# openssl dgst -md5 rsa.pub
MD5(rsa.pub)= 0803103e6685ad6ab4b37402a680e205

[[email protected] ~]# openssl md5 rsa.pub
MD5(rsa.pub)= 0803103e6685ad6ab4b37402a680e205

[[email protected] ~]# openssl sha512 rsa.pub
SHA512(rsa.pub)= aed7de92f0f4a3545a1afb29fbac75e16577e3edbb65f2a526ceedc28663f56b4b488ccf7b809f1e22369b7f2c5438b90daee70e3af8126a471acbd92278ddd7
[[email protected] ~]# openssl dgst -sha512 rsa.pub
SHA512(rsa.pub)= aed7de92f0f4a3545a1afb29fbac75e16577e3edbb65f2a526ceedc28663f56b4b488ccf7b809f1e22369b7f2c5438b90daee70e3af8126a471acbd92278ddd7

(3).生成一个私钥genrsa.pri,然后使用该私钥对/tmp/a.txt文件签名。使用-hex选项,否则默认输出格式为二进制会乱码。

[[email protected] tmp]# openssl genrsa -out genrsa.pri

[[email protected] tmp]# openssl dgst -md5 -hex -sign genrsa.pri a.txt
RSA-MD5(a.txt)= 7a6930b06dc6980d1a1fee872df5c8c9c887633c8e2f8b951d40aff4e934b206423914129f66651344859981e33c448f3a61274bded973b387065e9c7909bfcfc1d844e35af1453cc248d58170eb27e948a8de862f21a2b7ee34f512b3cc3cb44537e26c62a409e211320b87f74a8fa5ec1bcc790a7c13ffaa9df9aa8c5ddb64

如果要验证签名,那么这个生成的签名要保存到一个文件中,且一定不能使用"-hex"选项,否则验证签名必失败。以下分别生成使用和不使用hex格式的签名文件以待验证签名测试。

[[email protected] tmp]# openssl dgst -md5 -hex -out md5_hex.sign    -sign genrsa.pri   a.txt               
[[email protected] tmp]# openssl dgst -md5      -out md5_nohex.sign  -sign genrsa.pri   a.txt

(4).验证签名。验证签名的过程实际上是对待验证文件新生成签名,然后与已有签名文件进行比对,如果比对结果相同,则验证通过。所以,在验证签名时不仅要给定待验证的签名文件,也要给定相同的算法,相同的私钥或公钥文件以及待签名文件以生成新签名信息。

以下先测试以私钥来验证数字签名文件。

首先对未使用hex格式的签名文件md5_nohex.sign进行验证。由于生成md5_nohex.sign时使用的是md5算法,所以这里必须也要指定md5算法。

[[email protected] tmp]# openssl dgst -md5 -prverify genrsa.pri -signature md5_nohex.sign a.txt
Verified OK

再对使用了hex格式的签名文件md5_hex.sign进行验证,不论在验证时是否使用了hex选项,结果都是验证失败。

[[email protected] tmp]# openssl dgst -md5 -prverify genrsa.pri -signature md5_hex.sign a.txt  
Verification Failure

[[email protected] tmp]# openssl dgst -md5 -hex -prverify genrsa.pri -signature md5_hex.sign a.txt
Verification Failure

再测试使用公钥来验证数字签名。

[[email protected] tmp]# openssl rsa -in genrsa.pri -pubout -out rsa.pub

[[email protected] tmp]# openssl dgst -md5 -verify rsa.pub -signature md5_nohex.sign a.txt
Verified OK





以上是关于 openssl dgst(生成和验证数字签名)的主要内容,如果未能解决你的问题,请参考以下文章

使用 openssl dgst 验证文件签名

openssl 摘要和签名验证指令dgst使用详解

openssl rsautl(签名/验证签名/加解密文件)和openssl pkeyutl(文件的非对称加密)

6.openssl rsautl和openssl pkeyutl

公私钥生成

盲目签署和验证的库或软件是什么?