1. 程式人生 > >如何安全的存儲用戶密碼?

如何安全的存儲用戶密碼?

庫存 create pytho graph 當前 惡意攻擊 必須 密碼錯誤 table

  原文鏈接:請猛擊

本文我只截取了一小部分知識,請看原文。

一:基礎知識:加鹽哈希( Hashing with Salt)

我們已經知道,惡意攻擊者使用查詢表和彩虹表,破解普通哈希加密有多麽快。我們也已經

了解到,使用隨機加鹽哈希可以解決這個問題。但是,我們使用什麽樣的鹽值,又如何將其

混入密碼中?

鹽值應該使用加密的安全偽隨機數生成器( Cryptographically Secure Pseudo-Random

Number Generator,CSPRNG )產生。CSPRNG和普通的偽隨機數生成器有很大不同,

如“ C ”語言的rand()函數。顧名思義, CSPRNG 被設計成用於加密安全,這意味著它能提

供高度隨機、完全不可預測的隨機數。我們不希望鹽值能夠被預測到,所以必須使用 CSPRNG 。

下表列出了一些當前主流編程平臺的 CSPRNG 方法。

PlatformCSPRNG
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

每個用戶的每一個密碼都要使用獨一無二的鹽值。用戶每次創建帳號或更改密碼時,密碼應采用一個新的隨機鹽值。

永遠不要重復使用某個鹽值。這個鹽值也應該足夠長,以使有足夠多的鹽值能用於哈希加密。一個經驗規則是,鹽

值至少要跟哈希函數的輸出一樣長。該鹽應和密碼哈希一起存儲在用戶帳號表中。

存儲密碼的步驟:

  1. 使用 CSPRNG 生成足夠長的隨機鹽值。

  2. 將鹽值混入密碼,並使用標準的密碼哈希函數進行加密,如Argon2、 bcrypt 、 scrypt 或 PBKDF2 。

  3. 將鹽值和對應的哈希值一起存入用戶數據庫。

校驗密碼的步驟:

  1. 從數據庫檢索出用戶的鹽值和對應的哈希值。

  2. 將鹽值混入用戶輸入的密碼,並且使用通用的哈希函數進行加密。

  3. 比較上一步的結果,是否和數據庫存儲的哈希值相同。如果它們相同,則表明密碼是正確的;否則,該密碼錯誤。

如何安全的存儲用戶密碼?