md5會有重複的可能嗎?

一般認為任何一個字元串都有一個對應的md5加密串,md5的組成為32位十六進位數字,共有

16^32 = 3.4 * 10^38

種可能,如果將26個英文字母組合成32位字元串將有

26^32 = 1.9 * 10^45

種可能,很顯然用英文字母組合的32位字元串的可能性要遠多於md5的可能性,如果將26^32種字母組合依次進行md5加密,md5會出現不夠用的現象嗎?


一般認為任何一個字元串都有一個對應的md5加密串

的確這樣. md5演算法對輸入串的形式沒有要求.

如果將26個英文字母組合成32位字元串

顯然不是只有32位串才能被md5加密. 所以這麼比較無意義.

事實上有可數無窮多個字元串可以被md5加密, 所以自然會有重複, 但這不叫"不夠用". 因為大多數使用情形下, 有重複不會帶來很大問題, md5不是用完就沒了的。。。


肯定有重複啊..但是理論和工程使用是不一樣的.

比如:車肯定是會壞的啊..難道就不造車不買車不開車了么.

MD5 是有衝突,但如果我們能定性定量分析, 在實際使用場景下,完全是可以用的.衝突可以忍受的.

就比如,你造橋的時候, 要不要考慮"萬一有個sb連著中了10年500萬大獎結果發現自己還是沒有馬雲有錢一時想不開想去跳橋" 那麼我們要不要計算下一個人從橋面自由落體多少高度才可以達到成本,人的生命之間最佳平衡.然後根據這個指導思想去建橋? (設計人員瘋了么?)

實際上使用,比如xxx系統,用戶名密碼用MD5保存哪怕幾十億個用戶,恰巧某AB兩個用戶密碼分別是A密和B密,然後這倆密碼MD5衝突了,值是一樣的,又恰巧A用戶用A密和B用戶名登錄然後發現"哎呀卧槽, 我竟然登上了別人的帳號" 這種情況出現的概率估計比連續中500萬年500萬大獎的概率要低.(當然我沒算啊...逃)


如果沒有重複,那麼就是一對一的關係,那麼,你發明了世界上最強大的壓縮演算法。。

當然,這是題外話,MD5是一種散列值,就好比你手中有一把砂子,面前有一排瓶子,你要把砂子放到瓶子里,如何才能既隨機又均勻?當然,在這個演算法下,砂子進哪個瓶子是確定的,但隨著你砂子的增多,每個瓶子里的砂子肯定不止一粒。

我們一般用MD5拿來校驗文件,也就是所謂的文件指紋,就像你算的,MD5本身的容量還是相當大的,而逆向演算法計算量非常大(不過隨著破解演算法越來越先進,計算量會銳減),這樣每個文件的MD5值是確定的,而要在文件大小、屬性不變的前提下偽造一份MD5值一樣的文件來,難度大到可以讓你收益小於成本,也就沒什麼破解的必要了。

不過,現在MD5也不是很安全了,早幾年的碰撞演算法已經可以偽造一份第三方修改過的資料,當然代價還是頗高的。但是對於我這種只下下文件看看有沒有被篡改的人來說,MD5還是夠用的。


任何一個MD5散列值(密文), 對應無數多個原始字元串(明文), 這是從數學上可以直接得出的。

不僅是有重複, 而是任何一個值加密為MD5都有無數多個別的值與它重複


會重複的,會有多個不同的源串經過MD5簽名後結果相同的情況。但這不影響MD5的使用。MD5的作用並不是加密而是「簽名」(Signature)

MD5的核心第一是運算不可逆根據結果串非常難反推源串,第二就是簽名後的結果分布比較均勻,發生重複的幾率最小。這就足夠了,即使有重複又如何?你要用「試探法」來破解MD5,付出的代價是很高的。


在網上可以下到一個叫fastcoll的小工具,這個工具可以輕鬆創建兩個md5相同的文件,所以md5重複的概率是很大的,大到你隨手就可以這樣造出來一個。


2個md5一樣的例子:

[url]http://www.win.tue.nl/hashclash/SoftIntCodeSign/HelloWorld-colliding.exe

http://www.win.tue.nl/hashclash/SoftIntCodeSign/GoodbyeWorld-colliding.exe[/url]

如果不放心exe,可以看下面的

blogspot.com 的頁面


當然可能重複,而且僅從理論上講對任意一個字串會存在無數字串使得他們的md5值一致。但實際工程中發生碰撞的可能性很小,因為概率僅在10^-45的數量級別,這比你中五百萬的概率小的多得多。即便發生碰撞了也沒關係,因為如果你真想通過這種辦法來破解密碼或者做其他的事,那你的代價實在太大了,得不償失啊!


當然會有重複的,不過概率很低,幾乎忽略


md5一共才那麼多,串是無限多的啊,如果一一對應的話就別下載東西了,直接下載md5就好了。。。

現在已經能給一個md5直接來一個md5是這個的串了,但是通常都是個無語意的串,沒法用來做奇怪的用途(比如替換個包什麼的)。


1.9 * 10^45很大,但是世間萬物那麼多,如果都用md5去轉換一下,不可能不重複的。


看了這麼多答案,MD5確實會有重複的。在此基礎上,有一個有趣的現象:

首先有一個MD5:M1,
對M1再用MD5轉換一下得到M2,
對M2再用MD5轉換一下得到M3,
。。。。。。
對M(n)再用MD5轉換一下得到M(n+1),

總有一天,可以得到一個M(n) = M1, 也就是說,不斷的MD5會形成一個循環。哈哈。


推薦閱讀:

平滑的戰爭迷霧效果是如何實現的?
為什麼說平均情況下,插入排序比選擇排序快?
PageRank 演算法的複雜程度怎麼樣?
越來越多的群體智能演算法(蛙跳演算法、貓群演算法、蟑螂演算法等等)有存在的必要嗎?
搞信息安全需要什麼基礎。?

TAG:演算法 | 加密 | 密碼 | MD5 | 哈希函數 |