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