MD5能被破解嗎?


一、起因

最近在做一個普通的登錄界面,然后使用到了加密,然后之前朦朦朧朧的就聽到MD5這幾個字,所以就使用了MD5加密,網上老是說MD5是無法破解的,所以我是很相信的,但是直到我測試了一下驗證碼,發現我獲取到的加密后的驗證碼拿到那種破解md5密碼的網站上面去,居然一秒就破解了,這讓懷疑人生,不是說好破解不了的嗎?

二、開始研究md5

1.md5為什么不安全?

因為用md5加密后的東西被輕松破解了,所以我突然好奇這玩意是怎么加密解密的,所以隨便搜了一下md5可以破解嗎,看到這樣一個討論:

 

 

 

 

 那個說扯淡的大哥的評論我覺得很有道理,所以我點開了那個所謂加密解密的網站,測試了一下:

  var pass = $.md5('666')
  console.log(pass)

運行結果是:fae0b27c451c728867a567e8c1bb4e53

去到那個解密網站上試了一下,發現秒解出答案:

 

 

 所以我打開了MD5的官網:MD5官方網站

一切都明白了,官方文檔也說了md5的傳統使用方法現在會變得不安全:

 

 

 上面那些是官網說的,具體去官網看,我就不再贅述了,具體意思是說了3個MD5不安全的原因:

(1)現在的電腦計算能力都很強,即使md5加密很牛逼,但是由於強大的現代化計算機,一秒可以窮舉數以億次的密碼,所以一般那些所謂的破解都是使用窮舉類型破解;

(2)字典表很大,意思是說由於md5很流行,所以有人建立了一個數據庫,里面記錄了很多簡單的密碼組合對應的md5密文,如果你經常使用的密碼在里面,就會變得很不安全

(3)md5產生碰撞的幾率可能比其他密碼函數的幾率會大一點,這個我是感受不了,因為我沒有仔細研究過為什么會產生碰撞,以及那種類型的密碼組合會產生碰撞。

產生碰撞:即兩個不同的密碼使用md5加密后可能密文一樣,比如我的密碼是:‘’abc‘’,那么假設:‘’你滾‘’加密后的md5密文也與我的密碼abc加密后的結果一致,那么就叫碰撞,由於碰撞是很不安全的,比如用戶1輸入了它的密碼,然后一個黑客使用窮舉的方式進行匹配用戶1加密后的密文,如果產生碰撞,那么黑客無需找到和用戶1一樣的密碼加密后才能匹配,他只需要找到別的字符的加密結果也與用戶1輸入的密碼一致就好了。

 

這里記錄一下md5使用場景的用法:

 

 

 整個對比過程大概如上所示,如果別有用心的不法分子想破解你的密碼,那么碰撞可能產生這個問題:

 

 

 

回過頭來,繼續看看那個所謂的破解md5的網站:

再測試幾個案例:

var pass = $.md5('hmy666')
  console.log(pass)

運行結果:51957fc0888a2d125dc50f8a93efdbfc

 

 

 這個會破解得出很正常,因為這個密碼很簡單,況且據我剛剛搜到的關於md5的破解的博客,發現這個網站早在2006年就有人討論過這個網站可以破解簡單的md5,他網站是這樣描述的:

 

 

 的確運行了十幾年了,后台的幾十億數據應該不假,你只要輸入它數據庫已有的密碼對應的md5密文,它能立刻反饋給你,所以其實他並不是破解,他只是在后台查一下已有的數據字典,如果有這個匹配結果,就立馬反饋給你,俗稱破解。但是只要你輸入復雜一點的,比如加入千變萬化的中文字符,那么它就要開始它的窮舉之路了,我覺得此時才是開始他的破解之路:

  var pass = $.md5('hmy666,你試一試破解我啊?')
  console.log(pass)

運行結果:f559d04a65a5f8817fa4cbb60b9ccd48

 

 只要最多等待5天,就會破解給我,但是我覺得可能破解不出來。我注冊了他的網站,看看5天之內他能不能破解我的密文。

2.md5如何提高安全性

官網也給出了詳細的方案,直接看到官網比我講的好,這里還是簡單做一下自我記錄:

 

 (1)用鹽的意思就是給他加一點配料,不要簡單加密用戶的數據;

拿發送驗證碼來說,你可以發給前端的驗證碼是已經加了鹽的,就是比如:你發送的驗證碼是:7981,那么此時你可以自定義一個字符串,拼接在7981的前面和后面,然后再加密發送給前端,前端再根據約定好的字符串進行拼接,然后再加密,然后兩者進行比對,官網給出的方案其實是增加了密碼的長度,這樣加大了窮舉的難度。

(2)長密碼,其實這個方案是和用鹽一樣的,都是為了加長密碼的長度來增大窮舉難度。

注意我這里說的是增加了密碼的長度,而不是密文的長度,因為md5的加密后的密文都是32位的16進制。它的轉換是將你給的字符串的長度轉換為字節長度,然后用這個長度生成32位16進制的數字大小,並且是所有的字符串不管多長多短,都是生成一個32為的16進制的數字,所以md5可以存儲的無窮的數據,一個字符串對應唯一的md5值,但是一個md5對應多個字符串的數據,這就是上面所說的沖突。

關於md5加密的算法介紹可以看看這一篇:

1.https://blog.csdn.net/workdog/article/details/2039997?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&dist_request_id=1328769.82107.16177808514312293&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control

 

還有這個論壇下的回復:https://bbs.csdn.net/topics/320163686

我抄一下:

md5存儲的容量是無限制的,兄弟。。

另外給你說說MD5的原理吧。MD5是定長加密,也就是說不管你多長的東西,加密出來都是固定的位數。。

MD5是一種摘要算法,所以理論上是不可能從簽名取得原文(見下面說明)。認為要從MD5的結果中取得原文才算破解,本身就是對摘要算法的誤解。它通常應用於數字簽名中,用於標識原文的原始性--即在簽名后未作任何的修改。如果可以用不同的原文可以產生相同的簽名,這也就意味着簽名可能失效,就已經可以證明這種摘要算法的不安全。


一個安全的摘要算法在設計時必須滿足兩個要求:其一是尋找兩個輸入得到相同的輸出值在計算上是不可行的,這就是我們通常所說的抗碰撞的;其二是找一個輸入,能得到給定的輸出在計算上是不可行的,即不可從結果推導出它的初始狀態。

反之,如果某種摘要算法不能同時滿足上面兩個條件,則它就是不安全的。其實主要還是前一個條件,因為從理論上很容易證明后面一個條件基本上都是可以滿足的:

摘要算法對任意長的原文產生定長的簽名,按照香農的信息論,當原文的長度超過一定的程度的時候,簽名中就無法記錄原文中的所有信息,這意味着存在着信息的丟失,所以我說理論上不可能從簽名中恢復原文。 

為什么說理論上呢?就是說當這種摘要算法被完全攻破時,也就是說可以從簽名恢復出任意原文,注意:是任意原文,因為所有的摘要算法的特點就是存在着一個無窮大的碰撞原文的集合。而真正的原文只是其中一份。對應這個無窮大的集合來說,這就是一個無窮小,便是我曾經說過的: 

可能性為零,不表示不可能。 

解釋得具體一點是這樣:假設原文含有信息量(I),而簽名的長度有限(如MD5的128位),則它的信息量只有(i),因為通常 i < I (除非原文非常短),所以可以這么說:I=i+i'。因為I沒有限制,而i有限制,則 i' 也是一個沒有限制的量。當進行摘要算法后,i' 信息就丟失了。

反過來,如果現在這種摘要算法被攻破了,可以從 i 反推回去,但因為 i' 信息已經丟失,意味着 i + I' (其中 I' 為任意信息)都可能是 I (碰撞)。但 I' 是一個無窮集合,並且 i' 屬於 I'。這說明:理論上可以從 I' 中找到 i' 從而恢復出原文 I ,但是可能性為零(1/∞=0)。

但要做到前面一點就不容易了。因為絕對無碰撞的算法不可能是一個摘要算法,而只能是一個無損壓縮算法。它必須包含原文的所有信息,也就意味着它一但被攻破,可以唯一地恢復出原文。並且它的結果肯定是不定長的,因為它需要包含原文的所有信息,當然會根據原文的長度而變。僅這兩點就決定了,它不可能是一個好的簽名算法。 

最主要的一點是:摘要算法的用途決定了,它只要能找到碰撞就足以讓它失效,並不需要找到原文。

上面所說的,md5是存在碰撞的,絕對無碰撞的算法不是一個摘要算法,而在我給的鏈接的第一篇博客當中有記載了關於碰撞的實驗,據說是24天會產生一次碰撞,不過24天會產生一次碰撞對於完成幾分鍾內的短信驗證戳戳有余了,對於密碼的加密,md5也還是一個優秀的算法,因為通常你登錄網站的方式是密碼加驗證碼,那么黑客即使都拿到了你的密碼和驗證碼加密的md5密文,想要在幾分鍾內破解根本就是開玩笑。

(3)第三種解決方法就是不使用md5,去使用其他的加密。

   var   pass  =  $ . md5 ( 'hmy666,你試一試破解我啊?' )
   console . log ( pass )


免責聲明!

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



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