2016-03-28 69 views
0

我想按照提供的密碼教程here。我添加了用戶工作(我的鹽現在是硬編碼 - 缺少mcrypt_create_iv)。無論如何,當我跟進密碼檢查時,我會得到錯誤並且哈希值不同。哈希等於不表示應該

hash_equals($user->hash, crypt($password, $user->hash)) 

我正在爲crypt($password, $user->hash)*0$user->hash*1?每個教程都應該相同。

這些值的含義是什麼? *0對我來說似乎我的密碼加密功能不起作用?

這裏是我的加密密碼代碼:

$cost = 10; 

    // Create a random salt 
    #$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.'); 
    $salt = 'Banana'; 
    $salt = sprintf("$2a$%02d$", $cost) . $salt; 
    $hash = crypt($password, $salt); 

並通過改變鹽和密碼組合我不斷收到*0,所以一定出事了。我需要加載一些庫嗎?似乎缺少一些東西,我不知道是什麼。

+0

請使用官方密碼散列庫http://php.net/manual/en/ref.password.php – JimL

+0

很酷,謝謝。這是使用庫的標準方法嗎? –

回答

2

你真的應該只使用官方的密碼哈希LIB

$hash = password_hash('Banana', PASSWORD_DEFAULT, ['cost' => 10]); 

if (password_verify('Banana', $hash)) { 
    echo 'Password is valid!'; 
} 

http://php.net/manual/en/ref.password.php

+0

好的,謝謝。將研究它。 –

+0

嗯,我得到它運行,謝謝。但他們用PHP更新編寫,PASSWORD_DEFAULT可能會改變。當發生這種情況時,我的密碼DB中的所有哈希值都會改變,不是嗎? –

+1

@ElDude *建議將結果存儲在可擴展超過60個字符的數據庫列中(255個字符將是一個不錯的選擇)* - 舊密碼將保持呈現爲有效且實際的60個符號哈希值;但是,新的可能會更長(最多255)。 'password_verify'肯定會足夠聰明,可以同時使用這兩個版本。 – Axalix

0
hash_equals($user->hash, crypt($password, $user->hash)) 

現在你在這裏檢查,如果用戶>散列等於與加密後的密碼$,鹽,該用戶 - >散列而不是將其與用鹽加密的密碼比較如下:

hash_equals($user->hash, crypt($password, $salt)) 

另外我會建議使用password_hash()和password_verify()函數來做到這一點。