答:MD5算法不可以破解。
因為MD5是單向散列函數(shù),輸入任意長度的信息,經(jīng)過處理,輸出為128位的信息;不同的輸入得到的不同的結果;根據(jù)128位的輸出結果不可能反推出輸入的信息。所以不能從密文(散列值)反過來得到原文,即沒有解密算法。
MD5計算的過程中丟失了信息,一個MD5的值可以對應多個原文。一個MD5理論上的確是可能對應無數(shù)多個原文的,因為MD5是有限多個的而原文可以是無數(shù)多個。比如主流使用的MD5將任意長度的“字節(jié)串映射為一個128bit的大整數(shù)。也就是一共有2^128種可能,大概是3.4*10^38,這個數(shù)字是有限多個的,而但是世界上可以被用來加密的原文則會有無數(shù)的可能性。
舉個簡單例子:
原文:我今年大四
加密規(guī)則:
每個字取拼音聲調(diào)+筆畫數(shù),最后的結果計算乘積,為了也使得我的結果始終保持在一個限定范圍內(nèi),取最后結果取其與2^14=16384的余數(shù),如“我”是7畫3聲,也就是“特征值10”,以此類推,今4+1=5 年5+2=7 大3+4=7 四5+4=9,最后我發(fā)明的不可逆函數(shù)值就是10*5*7*7*9=22050與16384的余數(shù),也就是5666,如果單單給5666這個數(shù)字和加密算法,無論如何不可能推出原文是“我今年大四”的,不過如果給你“我今年大四”你卻很容易驗證答案是否正確。
網(wǎng)上有在線破解:
網(wǎng)上md5的破解主要都是采用暴力生成各種字符串組合然后進行hash,很多用戶的密碼都不夠復雜,所以很容易被這種方式生成出來。防范這種方式的辦法一個是隨機salt,只要salt夠隨機也夠長,就會帶來巨大的狀態(tài)空間,極大降低被暴力生成到的可能。另一個辦法是生成hash的速度夠慢,比如迭代1000次,這樣就大大降低了暴力運算的速度。
還有種破解就是采用彩虹表和字典:通過數(shù)據(jù)庫把常見字符轉的MD5存儲起來為彩虹表,然后直接反查。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,然后再用目標的MD5值在這個字典中檢索。
比如我通過大量例子發(fā)現(xiàn)某密文中A對應C,然后我會記在數(shù)據(jù)字典中,下次直接用C代替A,看上去好像了破解了,實則并沒有破解,只是找到了規(guī)律適應這種密文而已。