為什么說 MD5 是不可逆的?
md5是摘要算法,你學數據結構的時候學過哈希表吧?也有叫散列的。md5就是干那個用的
當然,如果硬要說的話。。。你可以用md5 hash一段字符串,也算是加密好了,不過你解不出來。。。。
當然,如果硬要說的話。。。你可以用md5 hash一段字符串,也算是加密好了,不過你解不出來。。。。
1+6=7,但是給你個7你能知道這是幾跟幾加得的嗎?
如果有人堅持認為MD5算法是可逆的,請不妨設想一下將MD5算法應用到文件壓縮方面,那豈不是又出現了一種超級壓縮技術了。。好幾個G大小的文件都能壓縮成一串MD5,反正"可以求逆"也就是解壓縮(如果應用於壓縮技術,算法就是公開的了,也不用費勁去破解了)。可惜這個顯然是不可能的,哈哈哈哈
如果有人堅持認為MD5算法是可逆的,請不妨設想一下將MD5算法應用到文件壓縮方面,那豈不是又出現了一種超級壓縮技術了。。好幾個G大小的文件都能壓縮成一串MD5,反正"可以求逆"也就是解壓縮(如果應用於壓縮技術,算法就是公開的了,也不用費勁去破解了)。可惜這個顯然是不可能的,哈哈哈哈
作者:李豆子
鏈接:http://www.zhihu.com/question/22651987/answer/23110721
來源:知乎
MD5+SALT BCRYPT
作者:余天升
鏈接:http://www.zhihu.com/question/21668719/answer/18937470
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
鏈接:http://www.zhihu.com/question/21668719/answer/18937470
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
生成一個隨機數,我們稱之為salt,然后在數據庫中記錄salt和h=hash(pwd + salt),查詢的時候,得到用戶的口令p,然后從數據庫中查出salt,計算hash(p+salt),看是不是等於h,等於就是對的,不等於就是不對的。
單純使用MD5之所以不好,並不是說MD5這種方法容易遭到破解,而事實上對於MD5求原象或者第二原象,也就是“逆計算”這種破解,沒有什么很好的方法。只能通過預先計算知道許多MD5的對應關系,存在數據庫中,然后使用的時候反查,例如我知道'password'的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一個數據庫存起來,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道這個是口令'password‘使用MD5處理之后的值,原來的口令就是'password'。MD5在身份鑒別系統中用於口令保護已經是很久了事情了,大部分黑客也有針對這種Hash方式准備相應的數據庫進行反查,這種數據庫稱為彩虹表。
所以,為了對抗彩虹表,我們要做的工作是避免預先計算,讓攻擊者無法(或者非常困難)提前計算好彩虹表。
為了反映為何彩虹表計算是可行的,我們再來算一下。我們假設用戶可能輸入的口令是鍵盤上的小寫字母和數字,共26+10=36種,之所以這樣假設是因為 一個用戶比較多的系統中總是會有一些弱口令用戶的,我們假設輸入的口令至少5個字符,至多12個字符,那么用戶可能的輸入一共有:
,而12個字節可能的組合應有
種。如果再考慮到用戶為了方便記憶,輸入的口令是一些已經存在的單詞或是詞組,可能的輸入將會遠遠少於
。用戶可能的輸入少了,就給了我們枚舉的空間。
為了阻止這種枚舉,加salt的方法是擴大用戶輸入的一種簡單有效的途徑,隨機生成一個16字節的隨機數,加上用戶本身輸入的至多12個字符的口令,可能的輸入就有
種,這么多種可能性,任何一個機構和組織都沒有辦法存儲規模如此龐大的彩虹表。
另外一種方法是通過提升Hash的復雜度,延長攻擊者進行暴力破解時所消耗的時間。現在顯卡用於並行計算實在太容易,6位純數字的口令在顯卡看來就是秒破。Hash算法的多次迭代就是最簡單的延長計算時間的方法,Apache的htpasswd就使用了MD5的1000次迭代,不過只是使得這些口令稍微難破解一些。
另外,題中使用了SHA1和MD5兩種算法的方法,除了稍微提升一點計算的難度以外,並沒有多好,這種組合方法不能增加用戶輸入的可能性,另外雖然SHA1生成的是160位的Hash,但是由於輸入是一個128位的MD5,所以輸出也至多只可能有
種可能,猜測的范圍也沒有縮小。所以這是原來回答我建議你使用更多次數(如1000次)MD5迭代的原因,至少應當有一個方面有稍微大一些的加強。
另外 此文(暴力密碼破解器 ocl-Hashcat-plus 支持每秒猜測最多 80 億個密碼,意味着什么?)中有數據可以供參考,bcrypt是一種有效對抗口令Hash破解的算法,建議使用。
單純使用MD5之所以不好,並不是說MD5這種方法容易遭到破解,而事實上對於MD5求原象或者第二原象,也就是“逆計算”這種破解,沒有什么很好的方法。只能通過預先計算知道許多MD5的對應關系,存在數據庫中,然后使用的時候反查,例如我知道'password'的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一個數據庫存起來,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道這個是口令'password‘使用MD5處理之后的值,原來的口令就是'password'。MD5在身份鑒別系統中用於口令保護已經是很久了事情了,大部分黑客也有針對這種Hash方式准備相應的數據庫進行反查,這種數據庫稱為彩虹表。
所以,為了對抗彩虹表,我們要做的工作是避免預先計算,讓攻擊者無法(或者非常困難)提前計算好彩虹表。
為了反映為何彩虹表計算是可行的,我們再來算一下。我們假設用戶可能輸入的口令是鍵盤上的小寫字母和數字,共26+10=36種,之所以這樣假設是因為 一個用戶比較多的系統中總是會有一些弱口令用戶的,我們假設輸入的口令至少5個字符,至多12個字符,那么用戶可能的輸入一共有:


種。如果再考慮到用戶為了方便記憶,輸入的口令是一些已經存在的單詞或是詞組,可能的輸入將會遠遠少於

為了阻止這種枚舉,加salt的方法是擴大用戶輸入的一種簡單有效的途徑,隨機生成一個16字節的隨機數,加上用戶本身輸入的至多12個字符的口令,可能的輸入就有

另外一種方法是通過提升Hash的復雜度,延長攻擊者進行暴力破解時所消耗的時間。現在顯卡用於並行計算實在太容易,6位純數字的口令在顯卡看來就是秒破。Hash算法的多次迭代就是最簡單的延長計算時間的方法,Apache的htpasswd就使用了MD5的1000次迭代,不過只是使得這些口令稍微難破解一些。
另外,題中使用了SHA1和MD5兩種算法的方法,除了稍微提升一點計算的難度以外,並沒有多好,這種組合方法不能增加用戶輸入的可能性,另外雖然SHA1生成的是160位的Hash,但是由於輸入是一個128位的MD5,所以輸出也至多只可能有

另外 此文(暴力密碼破解器 ocl-Hashcat-plus 支持每秒猜測最多 80 億個密碼,意味着什么?)中有數據可以供參考,bcrypt是一種有效對抗口令Hash破解的算法,建議使用。