openssl dgst(生成和驗證數字簽名)


openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


該偽命令是單向加密工具,用於生成文件的摘要信息,也可以進行數字簽名,驗證數字簽名。

首先要明白的是,數字簽名的過程是計算出數字摘要,然后使用私鑰對數字摘要進行簽名,而摘要是使用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:傳遞解密密碼。若驗證簽名時實用的公鑰或私鑰文件是被加密過的,則需要傳遞密碼來解密。密碼的格式見"openssl 密碼格式"

支持如下幾種單向加密算法,即簽名時使用的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).隨機生成一段摘要信息。

[root@toystory ~]# echo 123456 | openssl md5
(stdin)= f447b20a7fcbf53a5d5be013ea0b15af

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

[root@xuexi tmp]# openssl dgst -md5 a.txt
MD5(a.txt)= 0bbee18df3acef3f0f8496eb7e1d03ad
[root@xuexi tmp]# openssl sha512 a.txt   
SHA512(a.txt)= 1a47bd35ac33100904604e5bd0fb4ebf48b5a1a3c15a5173f17f4affe180d24e1afebbd4f08e08b80ded59383a319c85f978861505e898748b4bef6f07f64e22

(3).生成一個私鑰genrsa.pri,然后使用該私鑰對/tmp/a.txt文件簽名。使用-hex選項,否則默認輸出格式為二進制會亂碼。

[root@xuexi tmp]# openssl genrsa -out genrsa.pri

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

如果要驗證簽名,那么這個生成的簽名要保存到一個文件中,且一定不能使用"-hex"選項,否則驗證簽名必失敗。以下分別生成使用和不使用hex格式的簽名文件以待驗證簽名測試。

[root@xuexi tmp]# openssl dgst -md5 -hex -out md5_hex.sign -sign genrsa.pri a.txt               
[root@xuexi tmp]# openssl dgst -md5 -out md5_nohex.sign -sign genrsa.pri a.txt

(4).驗證簽名。驗證簽名的過程實際上是對待驗證文件新生成簽名,然后與已有簽名文件進行比對,如果比對結果相同,則驗證通過。所以,在驗證簽名時不僅要給定待驗證的簽名文件,也要給定相同的算法,相同的私鑰或公鑰文件以及待簽名文件以生成新簽名信息。

以下先測試以私鑰來驗證數字簽名文件。

首先對未使用hex格式的簽名文件md5_nohex.sign進行驗證。由於生成md5_nohex.sign時使用的是md5算法,所以這里必須也要指定md5算法。

[root@xuexi tmp]# openssl dgst -md5 -prverify genrsa.pri -signature md5_nohex.sign a.txt
Verified OK

再對使用了hex格式的簽名文件md5_hex.sign進行驗證,不論在驗證時是否使用了hex選項,結果都是驗證失敗。

[root@xuexi tmp]# openssl dgst -md5 -prverify genrsa.pri -signature md5_hex.sign a.txt  
Verification Failure

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

再測試使用公鑰來驗證數字簽名。

[root@xuexi tmp]# openssl rsa -in genrsa.pri -pubout -out rsa.pub

[root@xuexi tmp]# openssl dgst -md5 -verify rsa.pub -signature md5_nohex.sign a.txt
Verified OK


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM