常用消息摘要算法簡介

消息摘要算法是密碼學算法中非常重要的一個分支,它通過對所有數據提取指紋信息以實現數據簽名、數據完整性校驗等功能,由於其不可逆性,有時候會被用做敏感信息的加密。消息摘要算法也被稱為哈希(Hash)算法或散列算法。

任何消息經過散列函數處理後,都會獲得唯一的散列值,這一過程稱為 “消息摘要”,其散列值稱為 “數字指紋”,其算法自然就是 “消息摘要算法”了。換句話說,如果其數字指紋一致,就說明其消息是一致的。

常用消息摘要算法簡介

(圖片來源 —— https://zh.wikipedia.org/wiki/散列函數)

消息摘要算法的主要特徵是加密過程不需要密鑰,並且經過加密的數據無法被解密,目前可以解密逆向的只有 CRC32 算法,只有輸入相同的明文數據經過相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密鑰的管理與分發問題,適合於分佈式網絡上使用。消息摘要算法主要應用在 “數字簽名” 領域,作為對明文的摘要算法。著名的摘要算法有 RSA 公司的 MD5 算法和 SHA-1 算法及其大量的變體。

1.1 消息摘要算法的特點

  • 無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。 例如應用 MD5 算法摘要的消息有 128 個比特位,用 SHA-1 算法摘要的消息最終有 160 個比特位的輸出,SHA-1 的變體可以產生 192 個比特位和 256 個比特位的消息摘要。一般認為,摘要的最終輸出越長,該摘要算法就越安全。
  • 消息摘要看起來是 “隨機的”。 這些比特看上去是胡亂的雜湊在一起的,可以用大量的輸入來檢驗其輸出是否相同,一般,不同的輸入會有不同的輸出,而且輸出的摘要消息可以通過隨機性檢驗。 一般地,只要輸入的消息不同,對其進行摘要以後產生的摘要消息也必不相同;但相同的輸入必會產生相同的輸出。
  • 消息摘要函數是單向函數,即只能進行正向的信息摘要,而無法從摘要中恢復出任何的消息,甚至根本就找不到任何與原信息相關的信息。 當然,可以採用強力攻擊的方法,即嘗試每一個可能的信息,計算其摘要,看看是否與已有的摘要相同,如果這樣做,最終肯定會恢復出摘要的消息。但實際上,要得到的信息可能是無窮個消息之一,所以這種強力攻擊幾乎是無效的。
  • 好的摘要算法,沒有人能從中找到 “碰撞” 或者說極度難找到,雖然 “碰撞” 是肯定存在的(碰撞即不同的內容產生相同的摘要)。

1.2 消息摘要算法的應用

一般地,把對一個信息的摘要稱為該消息的指紋或數字簽名。數字簽名是保證信息的完整性和不可否認性的方法。 數據的完整性是指信宿接收到的消息一定是信源發送的信息,而中間絕無任何更改;信息的不可否認性是指信源不能否認曾經發送過的信息。 其實,通過數字簽名還能實現對信源的身份識別(認證),即確定 “信源” 是否是信宿意定的通信夥伴。 數字簽名應該具有唯一性,即不同的消息的簽名是不一樣的;同時還應具有不可偽造性,即不可能找到另一個消息,使其簽名與已有的消息的簽名一樣;還應具有不可逆性,即無法根據簽名還原被簽名的消息的任何信息。這些特徵恰恰都是消息摘要算法的特徵,所以消息摘要算法適合作為數字簽名算法。

1.3 消息摘要算法的家譜

消息摘要算法主要分為三大類:MD(Message Digest,消息摘要算法)、SHA-1(Secure Hash Algorithm,安全散列算法)和 MAC(Message Authentication Code,消息認證碼算法)。

如前文所述,MD5、SHA 和 MAC 都屬於消息摘要算法,它們是三大消息摘要算法的主要代表。

  • MD 系列算法包括 MD2、MD4 和 MD5 共 3 種算法;
  • SHA 算法主要包括其代表算法 SHA-1 和 SHA-1 算法的變種 SHA-2 系列算法(包含 SHA-224、SHA-256、SHA-384 和 SHA-512);
  • MAC 算法綜合了上述兩種算法,主要包括 HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384 和 HmacSHA512 算法。

儘管上述內容列舉了各種消息摘要算法,但仍不能滿足應用需要。基於這些消息摘要算法,又衍生出了 RipeMD 系列(包含 RipeMD128、RipeMD160、RipeMD256、RipeMD320)、Tiger、GOST3411 和 Whirlpool 算法。

二、MD 算法家族

2.1 簡述

MD 算法是應用非常廣泛的一個算法家族,尤其是 MD5(Message Digest Algorithm 5,消息摘要算法版本5),它由 MD2、MD3、MD4 發展而來,由 Ron Rivest(RSA 公司)在 1992 年提出,目前被廣泛應用於數據完整性校驗、數據(消息)摘要、數據簽名等。MD2、MD4、MD5 都產生 16 字節(128 位)的校驗值,一般用 32 位十六進制數表示。MD2 的算法較慢但相對安全,MD4 速度很快,但安全性下降,MD5 比 MD4 更安全、速度更快。

當軟件開發者在互聯網上分發軟件安裝包時,出於安全性考慮,通常會使用消息摘要算法,比如 MD5 算法產生一個與文件匹配的數字指紋,這樣接收者在接收到文件後,就可以利用一些現成的工具來檢查文件完整性。

常用消息摘要算法簡介

(圖片來源 —— https://en.wikipedia.org/wiki/MD5)

這裡我們來舉一個實際的例子,下圖是 MySQL Community Server 8.0.19 版本的下載頁,該下載頁通過 MD5 算法分別計算出不同軟件包的數字指紋,具體如下圖所示:

常用消息摘要算法簡介

(圖片來源 —— https://dev.mysql.com/downloads/mysql/)

當用戶從官網上下載到對應的安裝包之後,可以利用一些 MD5 校驗工具對已下載的文件進行校驗,然後比對最終的 MD5 數字指紋,若結果與官網公佈的數字指紋一致,則表示該安裝包未經過任何修改是安全的,可以放心安裝。

2.2 MD2 算法

1989 年,著名的非對稱算法 RSA 發明人之一—麻省理工學院教授羅納德·李維斯特(Ronald L.Rivest)開發了 MD2 算法。這個算法首先對信息進行數據補位,使信息的字節長度是 16 的倍數。再以一個 16 位的檢驗和作為補充信息追加到原信息的末尾。最後根據這個新產生的信息計算出一個 128 位的散列值,MD2 算法由此誕生。有關MD2 算法詳情請參見 RFC 1319( http://www.ietf.org/rfc/rfc1319.txt)。

2.3 MD4 算法

1990 年,羅納德·李維斯特教授開發出較之 MD2 算法有著更高安全性的 MD4 算法。在這個算法中,我們仍需對信息進行數據補位。不同的是,這種補位使其信息的字節長度加上 448 個字節後能成為 512 的倍數(信息字節長度 mod 512 = 448)。此外,關於 MD4 算法的處理與 MD2 算法又有很大差別。但最終仍舊是會獲得一個 128 位的散列值。MD4 算法對後續消息摘要算法起到了推動作用,許多比較有名的消息摘要算法都是在 MD4 算法的基礎上發展而來的,如 MD5、SHA-1、RIPE-MD 和 HAVAL 算法等。有關 MD4 算法的詳情請參見 RFC 1320( http://www.ietf.org/rfc/rfc1320.txt)。

2.4 MD5 算法

1991年,繼 MD4 算法後,羅納德·李維斯特教授開發了 MD5 算法,將 MD 算法推向成熟。MD5 算法經 MD2、MD3 和 MD4 算法發展而來,算法複雜程度和安全強度大大提高。 但不管是 MD2、MD4 還是 MD5 算法,其算法的最終結果均是產生一個 128 位的消息摘要,這也是 MD 系列算法的特點。 MD5 算法執行效率略次於 MD4 算法,但在安全性方面,MD5 算法更勝一籌。隨著計算機技術的發展和計算水平的不斷提高,MD5 算法暴露出來的漏洞也越來越多。1996 年後被證實存在弱點,可以被加以破解,對於需要高度安全性的數據,專家一般建議改用其他算法,如 SHA-2。2004 年,證實 MD5 算法無法防止碰撞(collision),因此不適用於安全性認證,如 SSL 公開密鑰認證或是數字簽名等用途。

下面我們來舉幾個示例,實際感受一下 MD5 算法:

MD5("semlinker") -> 688881f1c8aa6ffd3fcec471e0391e4dMD5("kakuqo")    -> e18c3c4dd05aef020946e6afbf9e04efMD5("lolo")      -> d6581d542c7eaf801284f084478b5fcc

備註:MD2、MD4、MD5 都產生 16 字節(128 比特位)的校驗值,一般用 32 位十六進制數表示。

三、SHA 算法家族

3.1 簡述

SHA 算法是基於 MD4 算法實現的,作為 MD 算法的繼任者,成為了新一代的消息摘要算法的代表。SHA 與 MD 算法不同之處主要在於摘要長度,SHA 算法的摘要更長,安全性更高。

SHA(Secure Hash Algorithm)是由美國專門制定密碼算法的標準機構 —— 美國國家標準技術研究院(NIST)制定的,SHA 系列算法的摘要長度分別為:SHA 為 20 字節(160位)、SHA256為 32 字節(256位)、 SHA384為 48 字節(384位)、SHA512為 64 字節(512位),由於它產生的數據摘要的長度更長,因此更難以發生碰撞,因此也更為安全,它是未來數據摘要算法的發展方向。由於 SHA 系列算法的數據摘要長度較長,因此其運算速度與 MD5 相比,也相對較慢。

目前 SHA1 的應用較為廣泛,主要應用於 CA 和數字證書中,另外在目前互聯網中流行的 BT 軟件中,也是使用SHA1 來進行文件校驗的。

不過隨著時間的推移,安全算法已不再安全。SHA-1 已經不再視為可抵禦有充足資金、充足計算資源的攻擊者。2005 年,密碼分析人員發現了對 SHA-1 的有效攻擊方法,這表明該算法可能不夠安全,不能繼續使用,自 2010 年以來,許多組織建議用 SHA-2 或 SHA-3 來替換 SHA-1。Microsoft、Google 以及 Mozilla 都宣佈,它們旗下的瀏覽器將在 2017 年前停止接受使用 SHA-1 算法簽名的 SSL 證書。

2017 年 2 月 23 日,CWI Amsterdam 與 Google 宣佈了一個成功的 SHA-1 碰撞攻擊,發佈了兩份內容不同但 SHA-1 散列值相同的 PDF 文件作為概念證明。下面讓我們簡要回顧一下 SHA 算法的發展歷史:

3.2 SHA-0 算法

1993 年,NIST 公佈了 SHA 算法家族的第一個版本,FIPS PUB 180。為避免混淆,現在我們稱之為 SHA-0 算法。但 SHA-0 算法在公佈不久後就被 NSA 撤回,原因是 NSA 發現 SHA-0 算法中含有會降低密碼安全性的錯誤。由此,SHA-0 算法還未正式推廣就已夭折。

3.3 SHA-1 算法

1995年,繼 SHA-0 算法夭折後,NIST 發佈了 FIPS PUB 180 的修訂版本 FIPS PUB 180-1,用於取代 FIPS PUB 180,稱為 SHA-1 算法,通常我們也把 SHA-1 算法簡稱為 SHA 算法。SHA-1 算法在許多安全協定中廣為使用,包括 TLS/SSL、PGP、SSH、S/MIME 和 IPsec,曾被視為是 MD5 算法的後繼者。

SHA-0 和 SHA-1算法可對最大長度為 264 的字節信息做摘要處理,得到一個 160 位的摘要信息,其設計原理相似於 MD4 和 MD5 算法。如果將得到 160 位的摘要信息換算成十六進制,可以得到一個 40 位(每 4 位二進制數轉換為 1 位十六進制數)的字符串。

3.4 SHA-2 算法

SHA 算法家族除了其代表 SHA-1算法以外,還有 SHA-224、SHA-256、SHA-384 和 SHA-512 四種 SHA 算法的變體,以其摘要信息字節長度命名,通常將這組算法並稱為 SHA-2 算法。 摘要信息字節長度的差異是 SHA-2 和 SHA-1 算法的最大差異。

2001 年,在 FIPS PUB 180-2 草稿中包含了 SHA-256、SHA-384 和 SHA-512 算法,隨即通過了審查和評論,於 2002 年以官方標準發佈。

2004 年 2 月,在 FIPS PUB 180-2 變更通知中加入了一個額外的變種 “SHA-224”,這是為了符合雙金鑰 3DES(三重 DES 算法)所需的金鑰長度而定義的。

3.5 SHA-3 算法

SHA-3 第三代安全散列算法(Secure Hash Algorithm 3),之前名為 Keccak 算法,設計者宣稱在 Intel Core 2 的 CPU 上面,此算法的性能是 12.5cpb(每字節週期數,cycles per byte)。不過,在硬件實現上面,這個算法比起其他算法明顯的快上很多。

SHA-3 在 2015 年 8 月 5 日由 NIST 通過 FIPS 202 正式發表。

下表展示了不同 SHA 算法對應的摘要長度:

算法摘要長度(比特位)SHA-1160SHA-224224SHA-256256SHA-384384SHA-512512

若小夥伴們需要進一步瞭解不同 SHA 算法之間的詳細差異,可以參考

維基百科 - SHA家族

四、MAC 算法家族

MAC(Message Authentication Code,消息認證碼算法)是含有密鑰散列函數算法,兼容了 MD 和 SHA 算法的特性,並在此基礎上加入了密鑰。因為 MAC 算法融合了密鑰散列函數(keyed-Hash),通常我們也把 MAC 稱為HMAC(Keyed-Hash Message Authentication Code)。

MAC 算法主要集合了 MD 和 SHA 兩大系列消息摘要算法。

  • MD 系列算法有 HmacMD2、HmacMD4 和 HmacMD5 三種算法;
  • SHA 系列算法有 HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384 和 HmacSHA512 五種算法。

下表展示了不同的 MAC 算法對應的摘要長度:

算法摘要長度(比特位)HmacMD5128HmacSHA1160HmacSHA256256HmacSHA384384HmacSHA512512HmacMD2128HmacMD4128HmacSHA224224

經 MAC 算法得到的摘要值也可以使用十六進制編碼表示,其摘要值長度與參與實現的算法摘要值長度相同。例如,HmacSHA1算法得到的摘要長度就是 SHA1 算法得到的摘要長度,都是 160 位二進制數,換算成十六進制編碼為 40 位。有關 HMAC 算法詳情請參見 RFC 2104( http://www.ietf.org/rfc/rfc2104.txt)。


分享到:


相關文章: