保護密碼的最好方法是使用加鹽哈希;算法
哈希算法是一種單向函數,把任意數量的數據轉換成固定長度的「指紋」,這個過程沒法逆轉。若是輸入發生一點改變,由此產生的哈希值徹底不一樣。數據庫
用戶建立本身的帳號;安全
密碼通過哈希加密後存儲在數據庫中。密碼一旦寫入磁盤,任什麼時候候都不容許明文形式;函數
用戶試圖登陸時,系統從數據庫取出已經加密的密碼,和通過哈希加密的用戶輸入的密碼進行對比;編碼
若是哈希值相同,用戶將被受權訪問。不然,告知輸入登陸信息無效;加密
只有加密哈希函數才能夠用來進行密碼哈希加密,像:sha256,sha512,ripemd和whirlpool都是加密哈希函數;ip
破解哈希加密的最簡單方法是嘗試猜想密碼,哈希每一個猜想的密碼,並對比猜想密碼的哈希值是否等於被破解的哈希值。若是相等則猜中。猜想密碼攻擊的兩種常見的方法是字典攻擊和暴力攻擊。字符串
破解相同類型的哈希值,查表法是一種很是高效的方式,主要理念是預先計算出密碼字典中的每一個密碼的哈希值,而後存儲相應的密碼到一個表裏。登錄
攻擊者從被黑的用戶帳號數據庫建立一個用戶名和對應的哈希表,而後攻擊者猜車一系列哈希值並使用該查詢表來查找使用此密碼的用戶。一般許多用戶都是用相同的密碼,這種方式很是有效。基礎
彩虹表是一種以空間換時間的技術。與查表法類似,只是使查詢表更小,犧牲了破解速度。由於彩虹表更小,因此單位空間能夠存儲更多的哈希值,從而使攻擊更有效。可以破解任何最多8位長度的MD5值擦彩虹表已經出現。
查表和彩虹表只有在全部密碼都以徹底相同的方式進行哈希加密纔有效,若是兩個用戶有相同的密碼,他們將有相同的密碼哈希值。能夠經過隨機化哈希,當同一個密碼哈希兩次後,獲得的哈希值是不同的,從而避免了這種攻擊。
能夠經過再密碼中加入一段隨機字符串進行哈希加密,這個被加的字符串稱爲鹽值。這使得相同密碼每次都被加密爲徹底不一樣的字符串,須要鹽值來校驗密碼是否正確。一般和密碼哈希值一同存儲在帳號數據庫中。
鹽值無需加密,因爲隨機化了哈希值,查表法,反向查表法,彩虹表都會失效。由於攻擊者沒法事先知道鹽值,因此他們沒有辦法預先計算。
錯誤就是每次都是用相同的鹽值進行哈希加密,這個鹽值要麼被硬編碼到程序中,要麼只在第一次使用時隨機得到。這樣作法是無效的,由於若是兩個用戶有相同的密碼,他們會有相同的哈希值。
若是鹽值過短,攻擊者能夠預先製做針對於全部可能的鹽值的查詢表。不該該將用戶名做爲鹽值,對每一個服務而言 ,用戶名是惟一的,他們是不可預測的。爲使攻擊者沒法構造包含全部可能鹽值的查詢表,鹽值必須足夠大,一個好的經驗使用和哈希函數輸出的字符串相等長的鹽值。
因爲哈希函數將任意大小的數據轉換成定長的字符串,所以,一定一些不一樣的輸入通過哈希計算以後獲得相同的字符串的狀況。可經過加鹽的方式解決。
鹽值應該使用加密的安全僞隨機數生成器產生。必須使用 CSPRNG;
使用 CSPRNG生成足夠長的隨機鹽值;
將鹽值混入密碼,並使用標準的密碼哈希函數進行加密 ,如Argon二、 bcrypt 、 scrypt 或 PBKDF2 ;
將鹽值和對應的哈希值一塊兒存入數據庫;
從數據庫檢索用戶的鹽值和響應的哈希值;
將鹽值混入用戶輸入的密碼,而且使用通用的哈希函數進行加密;
比較上一步的結果,是否和數據庫存儲的哈希值相同。相同則密碼正確,不然錯誤;