密碼及加密方式
保護密碼的最好方法是使用加鹽哈希;
哈希演算法
哈希演算法是一種單向函數,把任意數量的數據轉換成固定長度的「指紋」,這個過程無法逆轉。如果輸入發生一點改變,由此產生的哈希值完全不同。
基於哈希加密賬號系統中,用戶註冊和認證的大致流程如下:
用戶創建自己的賬號;
密碼經過哈希加密後存儲在資料庫中。密碼一旦寫入磁碟,任何時候都不允許明文形式;
用戶試圖登錄時,系統從資料庫取出已經加密的密碼,和經過哈希加密的用戶輸入的密碼進行對比;
如果哈希值相同,用戶將被授權訪問。否則,告知輸入登錄信息無效;
只有加密哈希函數才可以用來進行密碼哈希加密,像:sha256,sha512,ripemd和whirlpool都是加密哈希函數;
如何破解哈希
字典法:
破解哈希加密的最簡單方法是嘗試猜測密碼,哈希每個猜測的密碼,並對比猜測密碼的哈希值是否等於被破解的哈希值。如果相等則猜中。猜測密碼攻擊的兩種常見的方法是字典攻擊和暴力攻擊。
查表法:
破解相同類型的哈希值,查表法是一種非常高效的方式,主要理念是預先計算出密碼字典中的每個密碼的哈希值,然後存儲相應的密碼到一個表裡。
反向查表法:
攻擊者從被黑的用戶賬號資料庫創建一個用戶名和對應的哈希表,然後攻擊者猜車一系列哈希值並使用該查詢表來查找使用此密碼的用戶。通常許多用戶都是用相同的密碼,這種方式非常有效。
彩虹表:
彩虹表是一種以空間換時間的技術。與查表法相似,只是使查詢表更小,犧牲了破解速度。因為彩虹表更小,所以單位空間可以存儲更多的哈希值,從而使攻擊更有效。能夠破解任何最多8位長度的MD5值擦彩虹表已經出現。
加鹽:
查表和彩虹表只有在所有密碼都以完全相同的方式進行哈希加密才有效,如果兩個用戶有相同的密碼,他們將有相同的密碼哈希值。可以通過隨機化哈希,當同一個密碼哈希兩次後,得到的哈希值是不一樣的,從而避免了這種攻擊。
可以通過再密碼中加入一段隨機字元串進行哈希加密,這個被加的字元串稱為鹽值。這使得相同密碼每次都被加密為完全不同的字元串,需要鹽值來校驗密碼是否正確。通常和密碼哈希值一同存儲在賬號資料庫中。
鹽值無需加密,由於隨機化了哈希值,查表法,反向查表法,彩虹表都會失效。因為攻擊者無法事先知道鹽值,所以他們沒有辦法預先計算。
鹽值使用誤區
鹽值復用:
錯誤就是每次都是用相同的鹽值進行哈希加密,這個鹽值要麼被硬編碼到程序中,要麼只在第一次使用時隨機獲得。這樣做法是無效的,因為如果兩個用戶有相同的密碼,他們會有相同的哈希值。
短鹽值:
如果鹽值太短,攻擊者可以預先製作針對於所有可能的鹽值的查詢表。不應該將用戶名作為鹽值,對每個服務而言 ,用戶名是唯一的,他們是不可預測的。為使攻擊者無法構造包含所有可能鹽值的查詢表,鹽值必須足夠大,一個好的經驗使用和哈希函數輸出的字元串相等長的鹽值。
雙重哈希和古怪的哈希函數:
哈希碰撞:
由於哈希函數將任意大小的數據轉換成定長的字元串,因此,必定一些不同的輸入經過哈希計算之後得到相同的字元串的情況。可通過加鹽的方式解決。
如何正確進行哈希加密
基礎知識:加鹽哈希
鹽值應該使用加密的安全偽隨機數生成器產生。必須使用 CSPRNG;
存儲密碼步驟:
使用 CSPRNG生成足夠長的隨機鹽值;
將鹽值混入密碼,並使用標準的密碼哈希函數進行加密 ,如Argon2、 bcrypt 、 scrypt 或 PBKDF2 ;
將鹽值和對應的哈希值一起存入資料庫;
校驗密碼步驟:
從資料庫檢索用戶的鹽值和響應的哈希值;
將鹽值混入用戶輸入的密碼,並且使用通用的哈希函數進行加密;
比較上一步的結果,是否和資料庫存儲的哈希值相同。相同則密碼正確,否則錯誤;
? 著作權歸作者所有
TAG:服務端技術雜談 |