2013-02-12 106 views
1

我對PHP比較陌生,剛開始掌握了關於哈希密碼(我認爲?)的一點看法。無論如何,這是我的問題...基本的PHP pbkdf2散列

現在我有一個用戶名,密碼,鹽字段的MySQL數據庫。密碼字段長度爲64個字符,鹽字段爲3個字符。在註冊時,每個用戶名都被分配一個隨機鹽。我對此沒有任何問題(我相信)。首先,用戶期望的口令是通過散列:

$hashedinput = hash ('sha256', $input); 

的用戶期望的口令,然後用包含通過以下步驟PBKDF2鹽散列,並且在數據庫中輸入:

$password = pbkdf2('sha256', $hashedinput, $salt, 10000, 64); 

我問題在於登錄。將數據庫中的散列密碼與用戶輸入的密碼進行比較時,它總是返回!=。這是我做的驗證登錄:

$userData = mysql_fetch_array($search, MYSQL_ASSOC); 
$inputhash = hash('sha256', $input); // From Form 
$salt = $userData['salt']; // Salt from DB 
$password = pbkdf2('sha256', $inputhash, $salt, 10000, 64); 
$knownpassword = $userData['password']; // Known password from DB 

所以,解決我回顯所有的輸出,這是個什麼樣子,當我輸入正確的密碼(和它不記錄我)像:

輸入密碼:3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6e66913e43bf60478907ca07429b0cf90c808ce2097e0544cc44d298bfb7b85ad

DB密碼:3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6

注意,輸入密碼的前64個字符是正確的,但它總共繼續保留128個字符。 DB密碼僅爲64.

提前致謝!

回答

1

托馬斯Ptacek wrote a great article前陣子解釋 - 在一些細節上 - 是,爲什麼它是有用的,並給出了#1規則你所需要的鹽記住關於密碼哈希系統:

使用別人的密碼系統。不要建立你自己的。

如果您打算在應用程序中使用PHP 5.5,請使用新的password_hash API;如果您不是,請確保您至少使用PHP 5.3並使用password_hash userland compatability library。它們旨在爲您解除所有的痛苦。

+0

謝謝!該API非常有用。 – 2013-02-12 04:53:51