如何安全的存儲用戶密碼?
阿新 • • 發佈:2017-06-09
庫存 create pytho graph 當前 惡意攻擊 必須 密碼錯誤 table
原文鏈接:請猛擊
本文我只截取了一小部分知識,請看原文。
一:基礎知識:加鹽哈希( Hashing with Salt)
我們已經知道,惡意攻擊者使用查詢表和彩虹表,破解普通哈希加密有多麽快。我們也已經
了解到,使用隨機加鹽哈希可以解決這個問題。但是,我們使用什麽樣的鹽值,又如何將其
混入密碼中?
鹽值應該使用加密的安全偽隨機數生成器( Cryptographically Secure Pseudo-Random
Number Generator,CSPRNG )產生。CSPRNG和普通的偽隨機數生成器有很大不同,
如“ C ”語言的rand()函數。顧名思義, CSPRNG 被設計成用於加密安全,這意味著它能提
供高度隨機、完全不可預測的隨機數。我們不希望鹽值能夠被預測到,所以必須使用 CSPRNG 。
下表列出了一些當前主流編程平臺的 CSPRNG 方法。
Platform | CSPRNG |
---|---|
PHP | mcrypt_create_iv, openssl_random_pseudo_bytes |
Java | java.security.SecureRandom |
Dot NET (C#, VB) | System.Security.Cryptography.RNGCryptoServiceProvider |
Ruby | SecureRandom |
Python | os.urandom |
Perl | Math::Random::Secure |
C/C++ (Windows API) | CryptGenRandom |
Any language on GNU/Linux or Unix | Read from /dev/random or /dev/urandom |
每個用戶的每一個密碼都要使用獨一無二的鹽值。用戶每次創建帳號或更改密碼時,密碼應采用一個新的隨機鹽值。
永遠不要重復使用某個鹽值。這個鹽值也應該足夠長,以使有足夠多的鹽值能用於哈希加密。一個經驗規則是,鹽
值至少要跟哈希函數的輸出一樣長。該鹽應和密碼哈希一起存儲在用戶帳號表中。
存儲密碼的步驟:
-
使用 CSPRNG 生成足夠長的隨機鹽值。
-
將鹽值混入密碼,並使用標準的密碼哈希函數進行加密,如Argon2、 bcrypt 、 scrypt 或 PBKDF2 。
-
將鹽值和對應的哈希值一起存入用戶數據庫。
校驗密碼的步驟:
-
從數據庫檢索出用戶的鹽值和對應的哈希值。
-
將鹽值混入用戶輸入的密碼,並且使用通用的哈希函數進行加密。
-
比較上一步的結果,是否和數據庫存儲的哈希值相同。如果它們相同,則表明密碼是正確的;否則,該密碼錯誤。
如何安全的存儲用戶密碼?