信息摘要
- 區別于對稱加密和非對稱加密,信息摘要算數是一種不可逆的操作,無論輸入數據的大小輸出的數據長度是固定的
- 信息摘要算數對輸入很敏感,即使數據變化很細微,輸出的結果會出現很大的差異
- 從不同輸入得到相同的輸出的概率非常低,因此信息摘要算數用于驗證數據的完整性
數字簽名算法
- 非對稱加密算法,實質是使用非對稱算法的私鑰對數據進行加密,使用公鑰對密文進行驗證
- 數字簽名算法配合信息摘要算法的整體流程
- ?OpenSSL目前支持的信息摘要算法包括SHA1、SHA、MD5、MD4、MD2、MDC2和RIPEMD160。OpenSSL對所有這些信息摘要算法都提供了單獨的同名指令,此外,還使用了統一的指令dgst集成了所有支持的信息摘要算法的操作。
- 因為信息摘要算法通常跟數字簽名一起使用,所以,在所有的信息摘要算法指令中,OpenSSL還支持使用RSA或者DSA密鑰對摘要信息進行數字簽名和驗證過程,也就是說,所有這些信息摘要指令都能夠完成上面介紹的數字簽名的流程和數字簽名驗證的流程,這對于實際的應用具有重大的意義。
- 如表所示? 列出了OpenSSL支持的信息摘要指令。
- ?dgst指令的格式和其他信息摘要算法指令的格式基本上是保持一致的,下面是使用sha1算法進行信息摘要操作的兩個指令:
- ?如果你執行了上述兩條指令,會發現它們的輸出結果是一樣的,因為它們采用了相同的信息摘要算法SHA1。
- 仔細比較還會發現,這兩個指令除了dgst多了一個選擇算法的選項外,其他選項也是一致的。
- dgst指令跟其他單獨的信息摘要指令的不同之處還在于它支持使用DSA密鑰進行數字簽名和驗證操作。因為dgst和其他各種信息摘要算法的指令格式基本一致,所以在本章的介紹中,將以dgst指令為主線,在必要的時候給出其他信息摘要算法指令的說明。
dgst指令格式?
-
其他信息摘要算法指令通用的格式
- 上述指令中,dgst_cipher是OpenSSL支持的各種信息摘要算法的名稱,跟dgst指令中的dgst_cipher選項是基本一致的,但是在單獨指令中,不支持dss1指令的操作。我們如果要使用MD5信息摘要算法對一個文件進行信息摘要操作,則下面兩個指令是等價的:?
- ?算法類型參數字段的數值不區分大小寫,sha等同于SHA
- 從表還可以看出,摘要信息的位數一般都遠遠小于我們常用的公開密鑰算法的密鑰位數(1024),所以對摘要信息的簽名可以一次完成,與直接對原始文件簽名相比大大提高了簽名速度和驗證速度。
?指令選項說明
信息摘要算法選項
- 對于dgst指令來說,可采用的信息摘要算法有8種,具體參數可以參考表。對于單獨的信息摘要算法來說,該選項是不存在的,因為其指令本身就已經限定了使用的信息摘要算法
輸出文件選項out
- 輸出文件選項out指定了輸出信息的文件,輸出的信息包括摘要信息、驗證成功與否的信息及數字簽名信息等。輸出信息的格式根據使用的輸出格式選項的不一樣而不同。默認情況下使用的輸出文件是標準輸出設備,一般是當前指令行界面。
輸入文件選項files
- 該選項一般放在各個選項的最后,直接輸入要進行信息摘要操作、數字簽名操作或者驗證簽名操作的文件即可。dgst指令和其他單獨的信息摘要指令在這里可以同時對多個文件進行信息摘要操作,但是對于數字簽名和簽名驗證操作則只能每次針對一個文件,否則就可能導致驗證失敗。需要注意的是,無論是進行信息摘要操作、數字簽名操作還是驗證簽名操作,這里輸入的都應該是原來的明文文件。在信息摘要操作和數字簽名操作中,該文件信息被用來作為信息摘要函數的輸入,得到的摘要信息被保存或者進一步經過私鑰簽名后保存;而在簽名驗證過程中,該文件信息也被作為信息摘要函數的輸入,其結果跟用公鑰解密的數字簽名信息進行對比,如果一致,則驗證通過,否則驗證就失敗。
數字簽名選項
- dgst指令和其他單獨的信息摘要指令僅提供了一個跟簽名有關的選項sign,該選項的參數存儲了一個RSA或者DSA私鑰的文件。如果是RSA私鑰,那么說明將要使用的數字簽名算法是RSA算法,如果使用的是DSA私鑰,那么說明將要使用的算法是DSA數字簽名算法。DSA數字簽名算法只能在dgst指令中使用,并且要同時使用ds1作為算法選項參數。輸入私鑰的編碼格式由keyform選項指定,其格式可以是多種多樣的。
數字簽名驗證選項
- dgst指令和其他單獨信息摘要指令提供了三個跟數字簽名驗證有關的選項signature、verify和prverify。signatrue指定了保存要進行驗證的簽名信息的文件,通常來說,為了正確驗證,應該是一個二進制編碼的文件,十六進制編碼的文件可能導致不能正確驗證。這需要在進行數字簽名的時候不使用hex選項。
- verify選項跟prverify選項不能同時使用。使用verify選項表示將要輸入的用于驗證數字簽名的密鑰是一個公鑰;如果使用prverify選項,則表示將要輸入的文件保存的是一個私鑰,指令將從這個私鑰中讀取其公鑰參數進行數字簽名的驗證,之所以能夠這么做,是因為私鑰結構里面通常保存了所用公鑰參數。輸入密鑰的編碼格式由keyform選項決定。
輸入密鑰格式選項keyform
- keyform選項告訴指令輸入用于簽名或者驗證的密鑰屬于什么編碼格式。目前來說,如果輸入的是私鑰(使用sign選項簽名或者prverify選項驗證的時候),支持的格式包括DER編碼格式、PEM編碼格式、PKCS#12編碼格式、Netscape編碼格式、舊版的ISSGC編碼格式及ENGINE密鑰格式。如果輸入的是公鑰(使用verify選項驗證的時候),則比私鑰少支持一種PKCS#12格式,這是因為PKCS#12格式一般用來封裝證書和私鑰,而不直接用于封裝公鑰。如果keyform指定的密鑰格式是ENGINE格式(-keyforme),那么輸入的密鑰文件的內容和意義需要根據具體Engine接口而定,可能只是一個特定的字符串ID,可能是一個公鑰,也可能是毫無用處的內容。
engine選項
- engine選項指定了替代OpenSSL默認算法庫的Engine設備。對dgst指令和其他信息摘要算法指令來說,使用Engine選項可能會對幾個方面產生影響。首先是信息摘要算法,如果指定的Engine接口有效并且支持該選定的信息摘要算法,那么Engine設備里面的信息摘要算法就會被啟用。其次是數字簽名和驗證算法,如果指定Engine設備有效并且支持使用的數字簽名和驗證算法,那么Engine設備的數字簽名和驗證算法就會被啟用。第三個是隨機數產生及相關的操作,如果Engine設備支持隨機數產生和其他相關操作,那么這些Engine操作也會被啟用以替代OpenSSL本身的函數。
輸出格式選項
- 為了看起來方便或者其他原因,可能需要對輸出的摘要信息和數字簽名信息做一些格式調整,比如將二進制格式轉換成十六進制等。OpenSSL提供了一些此類選項。hex選項可以將輸出的摘要信息或者簽名信息進行十六進制編碼后輸出,但是驗證的時候可能導致驗證失敗。c選項只有跟hex選項一起使用才有效,它在每個十六進制數據編碼之間增加一個分隔符“:”,這樣便于查看。默認的摘要信息和簽名信息是以二進制的形式輸出的,如果要顯式表示使用二進制輸出,可以使用binary選項。d選項使用后指令會將BIO讀取文件的操作信息打印出來,一般是為了調試的目的才會使用這個選項。
隨機數文件選項
- 在dgst或其他信息摘要指令操作的過程中,有時候需要用到隨機數,那么同樣需要一個隨機數種子文件,這可以通過rand選項指定。事實上,在所有指令的rand選項中,指定的隨機數文件可以不止一個,而可以是多個,文件之間根據應用系統的不同采用不同的符號進行連接。比如Windows系統可以使用“;”作為連接符號,OpenVMS系統采用“,”作為連接符號,而其他系統則采用“:”作為連接符號。例如下面是Windows系統中使用多個隨機數文件的形式:
- 如果不使用rand選項,指令會從其他可用資源獲取隨機數種子。
使用信息摘要指令進行數字簽名和驗證
- 執行數字簽名
?有個問題,通過私鑰推導公鑰的時候并不知道 對私鑰加密使用的對稱加密算法的種類是啥,僅僅輸入了對稱密鑰是如何解密的呢??
驗證數字簽名?
?