奇妙的安全旅行之MD算法
hi,大家好,今天我們開始介紹消息摘要算法中的MD(Message Digest)算法,MD算法家族包括:MD2,MD4,MD5,MD算法生成的消息摘長度要都是128位的。
其中MD5算法是消息摘要算法的第五個版本,是當前最典型的消息摘要算法,它是由MD2和MD4算法改進而來的。不論是哪一種MD算法,它們都需要獲得一個隨機長度的信息并產生一個128位長度的信息摘要。如果將這個128位的二進制摘要信息換算成十六進制,就可以得到一個32位長的字符串,所以平時我們見到的大部分MD5算法生成的字符串都是一個32位長的十六進制的字符串。
從安全性上說:MD5 > MD4 > MD2,MD5算法安全性最高。
MD 算法家族的發展史:
MD2 算法:
1989年,著名的非對稱算法RSA發明人之一麻省理工學院教授羅納德·李維斯特教授開發了MD2算法。這個算法首先對信息進行數據補位,使信息的字節長度是16的倍數;再以一個16位的檢驗和做為補充信息追加到原信息的末尾;最后根據這個新產生的信息計算出一個128位的散列值,MD2算法由此誕生。
MD4 算法:
1990年,羅納德·李維斯特教授開發出較之MD2算法有著更高安全性的MD4算法。在這個算法中,我們仍需對信息進行數據補位。不同的是,這種補位使其信息的字節長度加上448個字節后成為512的倍數(信息字節長度mod 512 = 448)。此外,關于MD4算的處理和MD2算法有很大的差別,但最終仍舊會獲得一個長度為128位的散列值。MD4算法對后續消息摘要算法起到了推動作用, 許多比較有名的消息摘要算法都是在MD4算法的基礎上發展而來的,例如MD5、SHA-1、RIPE-MD和HAVAL算法等。
MD5 算法:
1991年,繼MD4算法后,羅納德.李維斯特教授開發了MD5算法,最終將MD系列算法推向了成熟。MD5算法經MD2和MD4算法發展而來,算法復雜程度和安全強度也大大提高,但這些MD算法的最終結果都是產生一個128位長度的信息摘要,這也是MD系列算法的主要特點。
MD 算法的對比
| MD2 | 128 | JDK、Bouncy Castle、Commons Codec |
| MD4 | 128 | Bouncy Castle |
| MD5 | 128 | JDK、Bouncy Castle、Commons Codec |
- MD2,MD4,MD5 計算的結果都是是一個128位(即16字節)的散列值,用于確保數據信息的完整一致性。
- MD2 算法加密速度較慢但相對安全,MD4 速度很快,但安全性下降,MD5 則比 MD4 更安全、速度更快。
- MD5 算法被廣泛應用于數據完整性校驗、數據(消息)摘要、數據加密等。
- 2004年,證實MD5 算法無法防止碰撞攻擊,因此不適用于安全性認證,如SSL公開密鑰認證或是數字簽名等用途。對于需要高度安全性的數據,一般建議改用其他更安全不容易破解的算法,如SHA-2。
MD 算法實現
JDK提供的 MD2 和 MD5 算法實現
Java的jdk中提供了MD2和MD5算法的實現,如果想實現MD5,可以直接使用JDk提供的方法來實現,示例代碼如下所示:
// MD2加密 public static String encodeMd2(byte[] data) throws Exception {// 初始化MessageDigestMessageDigest md = MessageDigest.getInstance("MD2");// 執行摘要信息byte[] digest = md.digest(data);// 將摘要信息轉換為32位的十六進制字符串return new HexBinaryAdapter().marshal(digest); }// MD5加密 public static String encodeMd5(byte[] data) throws Exception {// 初始化MessageDigestMessageDigest md = MessageDigest.getInstance("MD5");// 執行摘要信息byte[] digest = md.digest(data);// 將摘要信息轉換為32位的十六進制字符串return new HexBinaryAdapter().marshal(digest); }Bouncy Castle 補充的 MD4 算法實現
JDK中不提供對 MD4 算法的實現,Bouncy Castle幫我們實現了,需要引入Bouncy Castle的相關包,示例代碼如下所示:
// MD4加密 public static String encodeMd4(byte[] data) throws Exception {// 加入BouncyCastle的支持Security.addProvider(new BouncyCastleProvider());// 初始化MessageDigestMessageDigest md = MessageDigest.getInstance("MD4");// 執行摘要信息byte[] digest = md.digest(data);// 將摘要信息轉換為32位的十六進制字符串return new String(Hex.encode(digest)); }Commons Codec 的MD算法實現
Commons Codec 提供了 MD系列算法的消息摘要算法的實現,在使用時可以通過封裝的工具類-----DigestUtils類來進行操作。DigestUtils類是對Sun提供的MessageDigest類的一次封裝,提供了完整的實現方法。下面是關于MD5實現的示例:
// MD5加密 返回十六進制的字符串 public static String encodeMd5HexWithCodec(byte[] data) throws Exception {return DigestUtils.md5Hex(data); }// MD5加密,返回十進制的字節數組 public static byte[] encodeMd5WithCodec(byte[] data) {return DigestUtils.md5(data); }獲取完整代碼請訪問:
https://github.com/ForTheDevelopers/JavaSecurity
應用場景
由于MD5算法具有簡單快捷等特性,在實際應用中還是有很多場景中會使用,下面列舉一些我們常見的場景。
1、用戶密碼
MD5算法可以用于用戶注冊登錄時的密碼驗證,不過為了增加MD5被破解的難度,可以進行加鹽或亂序處理,也可以只取一半MD5的長度或者其他策略。MD5是不可逆算法,只要保證算法不變,就能和數據庫中的md5相匹配。不過MD5算法不是完全安全的,還是可能被破解的,可以作為一個低安全級別的應用場景。
2、文件完整性的校驗
當我們在下載一個文件時,通常會在下載文件頁面中顯示這個文件的MD5值,在本地下載完成后可以對下載的文件進行MD5計算,并將兩個MD5值進行比較,如果一致則說明文件完整沒有被篡改,說明是網站的源文件。這種可以有效防止文件被黑客利用進行病毒的植入,一旦文件被篡改,MD5值就不一樣了。例如,我們在Oracle官方下載jdk時通常會看到這個頁面:
3、搜索
以某網站內容搜索為例,可以使用搜索關鍵詞的MD5值來設置索引,例如你輸入我是開發者FTD 公眾號 和 輸入**公眾號 我是開發者FTD **搜索的結果是不一樣的,因為這兩個關鍵詞對應的MD5值是不一樣的,我們可以根據這個MD5值去定義唯一的搜索關鍵詞。
4、著作版權
當一個視頻或者音頻創作出來的時候它的MD5值是唯一的,若以后有翻錄等版本出來,即使畫質,聲音,文件名都一樣,但是他們的MD5值驗證是不一樣的,所以可以驗證版權。還比如用某一賬戶下載的視頻它的賬戶信息也回和視頻一起MD5值操作,如果以后這個人私自傳播通過MD5值就可以去數據庫中查找泄露版權的情況。
5、訂單信息的校驗
現在支付工具對大家都比較熟悉了,你有沒有想過如果在支付過程中,黑客將訂單攔截并修改了支付金額,是不是就可以免費或很便宜的買東西了呢?這時服務器端就可以使用MD5來校驗訂單的真實性,看看收到的訂單是不是最初用戶下單時的訂單,如果發現訂單被修改了,則支付失敗,有效的預防了商家的損失。
MD5算法的不足
上面說到了MD5算法抗碰撞性的特點,因此在實際應用中MD5被認為是非常安全的,但是在2004年,咱們中國山東大學的王小云教授以及她的同事在美國加州舉辦的密碼學會議上宣布破解了MD5算法,其實也不是真正的破解,而是非常明顯的加快了尋找一對碰撞的速度,利用她們的技術,可以在幾個小時內就找到一對碰撞,極端情況下,甚至在2008年計算機的計算能力上,幾秒鐘就可以找到一對碰撞。
因此MD5算法的安全性就引起人們的擔憂,所以在對安全性要求較高的場合,不建議直接使用MD5算法。
總結
雖然MD5算法現在看來并不是絕對安全的,但是MD5算法的簡單快速便捷性也是其他算法無法比擬的,MD5算法還是有很多場景在使用,大家也可以根據自己實際業務的需求來選擇是否使用MD5算法。
全性要求較高的場合,不建議直接使用MD5算法。**
總結
雖然MD5算法現在看來并不是絕對安全的,但是MD5算法的簡單快速便捷性也是其他算法無法比擬的,MD5算法還是有很多場景在使用,大家也可以根據自己實際業務的需求來選擇是否使用MD5算法。
創作不易,如果大家喜歡本文,歡迎點贊,轉發,你的關注是我們繼續前進的動力_
總結
以上是生活随笔為你收集整理的奇妙的安全旅行之MD算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lua安全之关于lua扩展第三方库
- 下一篇: springcloud 创建子父项目_i