MD5檢視原始碼討論檢視歷史
MD5 |
中文名: 消息摘要算法 外文名: Message Digest Algorithm MD5 別 名: 摘要算法 提出者: 羅納德·李維斯特 提出時間: 1992年 應用學科: 信息技術,計算機科學 |
MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用於確保信息傳輸完整一致。MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,於1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標準中被加以規範。1996年後該算法被證實存在弱點,可以被加以破解,對於需要高度安全性的數據,專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞(collision),因此不適用於安全性認證,如SSL公開密鑰認證或是數字簽名等用途。[1]
目錄
發展歷史
1992年8月,羅納德·李維斯特向互聯網工程任務組(IETF)提交了一份重要文件,描述了這種算法的原理。由於這種算法的公開性和安全性,在90年代被廣泛使用在各種程序語言中,用以確保資料傳遞無誤等。 MD5由MD4、MD3、MD2改進而來,主要增強算法複雜度和不可逆性。MD5算法因其普遍、穩定、快速的特點,仍廣泛應用於普通數據的加密保護領域。
MD2
Rivest在1989年開發出MD2算法。在這個算法中,首先對信息進行數據補位,使信息的字節長度是16的倍數。然後,以一個16位的校驗和追加到信息末尾,並且根據這個新產生的信息計算出散列值。後來,Rogier和Chauvaud發現如果忽略了校驗和MD2將產生衝突。MD2算法加密後結果是唯一的(即不同信息加密後的結果不同)。
MD4
為了加強算法的安全性,Rivest在1990年又開發出MD4算法。MD4算法同樣需要填補信息以確保信息的比特位長度減去448後能被512整除(信息比特位長度mod 512 = 448)。然後,一個以64位二進制表示的信息的最初長度被添加進來。信息被處理成512位damgard/merkle迭代結構的區塊,而且每個區塊要通過三個不同步驟的處理。Den boer和Bosselaers以及其他人很快的發現了攻擊MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的個人電腦在幾分鐘內找到MD4完整版本中的衝突(這個衝突實際上是一種漏洞,它將導致對不同的內容進行加密卻可能得到相同的加密後結果)。
MD5
1991年,Rivest開發出技術上更為趨近成熟的MD5算法。它在MD4的基礎上增加了"安全帶"(safety-belts)的概念。雖然MD5比MD4複雜度大一些,但卻更為安全。這個算法很明顯的由四個和MD4設計有少許不同的步驟組成。在MD5算法中,信息-摘要的大小和填充的必要條件與MD4完全相同。Den boer和Bosselaers曾發現MD5算法中的假衝突(pseudo-collisions),但除此之外就沒有其他被發現的加密後結果了。
原理
MD5算法的原理可簡要的敘述為:MD5碼以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。 總體流程如下圖所示,每次的運算都由前一輪的128位結果值和當前的512bit值進行運算。 在MD5算法中,首先需要對信息進行填充,這個數據按位(bit)補充,要求最終的位數對512求模的結果為448。也就是說數據補位後,其位數長度只差64位(bit)就是512的整數倍。即便是這個數據的位數對512求模的結果正好是448也必須進行補位。補位的實現過程:首先在數據後補一個1 bit; 接着在後面補上一堆0 bit, 直到整個數據的位數對512求模的結果正好為448。總之,至少補1位,而最多可能補512位。
擴展長度
在完成補位工作後,又將一個表示數據原始長度的64 bit數(這是對原始數據沒有補位前長度的描述,用二進制來表示)補在最後。當完成補位及補充數據的描述後,得到的結果數據長度正好是512的整數倍。也就是說長度正好是16個(32bit) 字的整數倍。
初始化MD緩存器
MD5運算要用到一個128位的MD5緩存器,用來保存中間變量和最終結果。該緩存器又可看成是4個32位的寄存器A、B、C、D,初始化為
A : 01 23 45 67 B: 89 ab cd ef C: fe dc ba 98 D: 76 54 32 10
處理數據段
首先定義4個非線性函數F、G、H、I,對輸入的報文運算以512位數據段為單位進行處理。對每個數據段都要進行4輪的邏輯處理,在4輪中分別使用4個不同的函數F、G、H、I。每一輪以ABCD和當前的512位的塊為輸入,處理後送入ABCD(128位)。
輸出
信息摘要最終處理成以A, B, C, D 的形式輸出。也就是開始於A的低位在前的順序字節,結束於D的高位在前的順序字節。 當我們需要保存某些密碼信息以用於身份確認時,如果直接將密碼信息以明碼方式保存在數據庫中,不使用任何保密措施,系統管理員就很容易能得到原來的密碼信息,這些信息一旦泄露, 密碼也很容易被破譯。為了增加安全性,有必要對數據庫中需要保密的信息進行加密,這樣,即使有人得到了整個數據庫,如果沒有解密算法,也不能得到原來的密碼信息。MD5算法可以很好地解決這個問題,因為它可以將任意長度的輸入串經過計算得到固定長度的輸出,而且只有在明文相同的情況下,才能等到相同的密文,並且這個算法是不可逆的,即便得到了加密以後的密文,也不可能通過解密算法反算出明文。這樣就可以把用戶的密碼以MD5值(或類似的其它算法)的方式保存起來,用戶註冊的時候,系統是把用戶輸入的密碼計算成 MD5 值,然後再去和系統中保存的 MD5 值進行比較,如果密文相同,就可以認定密碼是正確的,否則密碼錯誤。通過這樣的步驟,系統在並不知道用戶密碼明碼的情況下就可以確定用戶登錄系統的合法性。這樣不但可以避免用戶的密碼被具有系統管理員權限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。
電子簽名
MD5 算法還可以作為一種電子簽名的方法來使用,使用 MD5算法就可以為任何文件(不管其大小、格式、數量)產生一個獨一無二的「數字指紋」,藉助這個「數字指紋」,通過檢查文件前後 MD5 值是否發生了改變,就可以知道源文件是否被改動。我們在下載軟件的時候經常會發現,軟件的下載頁面上除了會提供軟件的下載地址以外,還會給出一串長長的字符串。這串字符串其實就是該軟件的MD5 值,它的作用就在於下載該軟件後,對下載得到的文件用專門的軟件(如 Windows MD5 check 等)做一次 MD5 校驗,以確保我們獲得的文件與該站點提供的文件為同一文件。利用 MD5 算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數據庫、系統文件安全等方面。
垃圾郵件篩選
在電子郵件使用越來越普遍的情況下,可以利用 MD5 算法在郵件接收服務器上進行垃圾郵件的篩選,以減少此類郵件的干擾,具體思路如下: 建立一個郵件 MD5 值資料庫,分別儲存郵件的 MD5 值、允許出現的次數(假定為 3)和出現次數(初值為零)。 對每一封收到的郵件,將它的正文部分進行MD5 計算,得到 MD5 值,將這個值在資料庫中進行搜索。 如未發現相同的 MD5 值,說明此郵件是第一次收到,將此 MD5 值存入資料庫,並將出現次數置為1,轉到第五步。 如發現相同的 MD5 值,說明收到過同樣內容的郵件,將出現次數加 1,並與允許出現次數相比較,如小於允許出現次數,就轉到第五步。否則中止接收該郵件。結束。 接收該郵件。
安全性分析
MD5相對MD4所作的改進: 增加了第四輪。 每一步均有唯一的加法常數。 減弱第二輪中函數的對稱性。 第一步加上了上一步的結果,這將引起更快的雪崩效應(就是對明文或者密鑰改變 1bit 都會引起密文的巨大不同)。 改變了第二輪和第三輪中訪問消息子分組的次序,使其更不相似。 近似優化了每一輪中的循環左移位移量以實現更快的雪崩效應,各輪的位移量互不相同。 MD5 算法自誕生之日起,就有很多人試圖證明和發現它的不安全之處,即存在碰撞(在對兩個不同的內容使用 MD5算法運算的時候,有可能得到一對相同的結果值)。2009年,中國科學院的謝濤和馮登國僅用了
的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。
JavaScript實現
JavaScript 版本的實現代碼,可以用於瀏覽器中運行和計算文本字符串的 MD5。
參考來源
- ↑ [ ], , --