2016-04-10 60 views
0

當用戶註冊並登錄時,我使用相同的password_hash函數來對明文密碼進行哈希處理。註冊並登錄時,PHP密碼哈希值不一樣

password_hash($password, PASSWORD_DEFAULT)

但密碼是不一樣的。

我可以證明這另一種方式,只需註冊兩個用戶使用相同的密碼。

例如 「管理員」 變成 「$ 2Y $ 10 $ SyqILazLbo4jJVYvxYfwW.WgHUnSi.cRMETWoMjZXwMNa4H4tYELK」

上一個用戶,和 「$ 2Y $ 10 $ gXfVz6oH4afxAL.7ytFJseZV3VERxbSYXqN7FYsRzH4IrjJw9uyO6」 在另一個上。這意味着password_hash將永遠不會相同,因此用戶無法登錄。

我在做什麼錯?

+2

這是正常的,因爲該功能將每次產生不同的哈希值。現在你爲什麼要說什麼似乎是他們*永遠不會*登錄? –

+0

要登錄,用戶提供他們的用戶名和密碼。密碼必須在數據庫中進行散列處理,所以.. username must = username。密碼必須=密碼。如果每次散列值不同,密碼將如何相等? – user3822370

+1

這就是函數的工作原理,所以不要擔心。 –

回答

3

documentation您需要使用password_verify驗證密碼是否正確與否的例子。事情是這樣的

<?php 

$password = "rasmuslerdorf"; 

$hash = password_hash($password, PASSWORD_DEFAULT); 

if (password_verify($password, $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 

?> 

reference page

1

您需要使用函數password_verify($user_submitted_password, $hash_in_db)來檢查結果。 password_hash()在每次哈希中嵌入一個隨機鹽,這就是爲什麼鍵是不同的,但它會驗證正確。

password_verify()

<?php 
// See the password_hash() example to see where this came from. 
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

if (password_verify('rasmuslerdorf', $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
?>