理論上md5是不可逆的,而且md5本來也不是作加密使用,而是用來校驗資料的完整性,只是因為其不可逆且穩定、快速的特點,被廣泛用於對明文密碼的加密。
至今仍然後很多開發人員相信md5的保密性,也許因為他們知道md5的演算法,覺得hash不可逆。但實際上,真正要破解md5的人,不會選擇逆向逆的明文,都是用hash碰撞。把一些明文密碼md5 hash一遍之後對比哪個md5值與你的一樣。那你的明文就知道了。類似於乙個比對詞典,叫做彩虹表。
舉個例子比如乙個密碼是『88888888』那麼任何採用標準md5加密的**資料庫中,存放的都是8ddcff3a80f4189ca1c9d4d902c3c909這樣乙個md5值。
由於密文相同,大多數**和系統的加密都是以相同的明文口令生成相同的密文。所以,那些高頻的密文就是高頻明文的口令。攻擊者可以針對標準演算法來制定高頻明文的對應密文文件來查詢比對。通過窮舉的方式制定數字字母組合的口令與多種演算法加密結果的對映結果集,就形成了彩虹表。
加鹽雜湊加鹽法(hash+salt)。所謂加鹽(salt)其實就是生成hash時給予乙個干擾,使結果與標準的hash結果不同,從而對抗彩虹表。
比如說使用者密碼『88888888』,加乙個鹽(乙個隨機字串)『q1we2rt3y6u8io7p』,拼接到一起在計算md5,結果值就變了。這樣即使使用者使用弱密碼,也能一定程度上防禦彩虹攻擊。但是如果每個密碼加的鹽都是一樣的,那麼就又回到了之前的問題了。
一人一密
我們要實現,相同的站點,不同使用者的相同的密碼口令不同。這樣就能有效的對付碰撞和統計攻擊。例如:加自定義的鹽。密碼拼接使用者名稱或者時間戳在計算md5。
使用者註冊時:
1.使用者輸入[username]和[password]
2.系統為使用者生成[salt值]
3.系統將[salt值]和[password]拼接在一起
4.對拼接後的值進行雜湊,得到[hash1]
5.將[hash1]和[salt值]放在資料庫中。
使用者登入時:
1.使用者輸入[username]和[password]
2.系統通過使用者名稱找到與之對應的[hash1]和[salt值]
3.系統將[salt值]和[使用者輸入的密碼]拼接在一起
4.對拼接後的值進行雜湊,得到[hash2]
5.對比[hash1]和[hash2]是否相等,相等則授權登入
一種簡單的給MD5加鹽演算法
現在的md5密碼資料庫的資料量已經非常龐大了,大部分常用密碼都可以通過md5摘要反向查詢到密碼明文。為了防止內部人員 能夠接觸到資料庫或者資料庫備份檔案的人員 和外部入侵者通過md5反查密碼明文,更好地保護使用者的密碼和個人帳戶安全 乙個使用者可能會在多個系統中使用同樣的密碼,因此涉及到使用者在其他...
MD5演算法及其加鹽實現使用者安全登入
日常生活中登入某系統或者登入社交軟體中會涉及使用者名稱及登入密碼等,可用md5演算法對密碼進行轉換儲存 注意md5不是加密,有加密必有解密 由於md5的不可逆和抗碰撞使得密碼儲存更加安全。資料轉換md5值的方法 public static string ge 5 string sdatain ret...
md5加密篇(一)
獲取檔案的md5摘要 檔案流 md5摘要結果 public static string getabstracttomd5 stream sfile return sb.tostring 獲取檔案的md5摘要 檔案流 md5摘要結果 public static string getabstractto...