2017-07-21 73 views
0

我使用下面的步驟來創建一個散列將被保存在我的DB:密碼散列是不可靠的

$ret=randStrGen(100).time(); 
$gtch = chunk_split($a,1,'.;l89b_-'); 
$Thm = hash_hmac('sha512', $gtch, file_get_contents('serial.txt')); 
$hash =crypt($Thm,sprintf('$2y$%02d$',4).randStrGen(22).$ret); 

的主要問題是變量$hash並不總是返回一個哈希值,而是返回*0。所以它不可靠,我不知道爲什麼會發生這種情況?

編輯:問題迎刃而解

從隱窩()文檔:

crypt_blowfish的 - 與鹽的Blowfish散列如下: 「$ 2A $」, 「$ 2X $」 或「$ 2Y $「,一個兩位數字的成本參數」$「和字母表」.0-9A-Za-z「中的22個字符 。在salt中使用 範圍以外的字符會導致crypt()返回一個零長度的字符串。

用作鹽的我的randStrGen()實際上是使用非字母數字字符,這是問題的原因。感謝大家。

+4

這不回答你的問題,但如果你想哈希密碼,你應該只使用'password_hash' – mpen

+2

這是你在這裏很危險的代碼。不要**包裝自己的**串哈希,使用內置的方法,它們更安全。 – GrumpyCrouton

+1

由於標題是「密碼哈希」:當保存密碼驗證者只使用散列函數是不夠的,只是添加鹽沒有提高安全性。相反,用隨機鹽迭代HMAC約100ms持續時間,然後用散列表保存鹽。使用諸如'PBKDF2','Rfc2898DeriveBytes','password_hash','Bcrypt','passlib.hash'或類似函數的函數。關鍵是要讓攻擊者花費大量時間通過強力查找密碼。 – zaph

回答

0

正如您已經發現的那樣,salt必須採用特定格式,並非所有字符都允許用於BCrypt,這就是錯誤的原因。

您的代碼的另一個問題是成本因素,這是太低,不能有效保護密碼。目前它應該至少大約爲10.

也就是說,你絕對應該使用內置函數password_hash()和password_verify(),它們使用最佳實踐來生成安全的salt以及其他難以部件,如向後兼容未來算法。

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb);