2014-11-08 65 views
0

所以我散列字符串「測試」不能讓PHP password_hash API工作

$hash = password_hash("test", PASSWORD_DEFAULT); 

在我的密碼字段保存它(VARCHAR 255)

然後我做了一個簡單的測試登錄頁面

if (!empty($_POST['username']) && !empty($_POST['password'])) 
{ 

$username = trim($_POST['username']); 
$password = trim($_POST['password']); 

$stmt = $db->prepare("SELECT username, password FROM users WHERE username = ? AND password = ?"); 
$stmt->execute(array($username, $password)); 
$row = $stmt->fetch(); 
$hash = $row['password']; 

if (password_verify($password, $hash)) { 
//success 
} else { 
//wrong credentials 
} 

然後我輸入用戶名和密碼test,但它返回false時,它應返回true(但顯然我錯了,因爲這不,在這裏我在想念的東西)

我在這裏做錯了什麼?

一直在讀它,但我不知道爲什麼它不會返回true。請注意,我是新手。

此外,爲什麼鹽,我猜,前6個字符,開始在散列總是相同的? $2y$10。那不好。

+0

你的文字輸入'$密碼「在SELECT查詢中不匹配,當該列包含散列時。 – mario 2014-11-08 05:38:09

回答

-1

我的猜測是你在數據庫中存儲哈希密碼。

在您需要通過它的哈希密碼的where子句,而不是純文本

$stmt->execute(array($username, password_hash($password)));

同樣的事情在if語句,確保兩個被散列

+0

我剛剛意識到這一點....神愚蠢的 – Smugglaren 2014-11-08 05:38:33

+0

@Suggglaren不,你不是,發生在我們最好的! – 2014-11-08 05:39:44

+1

這是錯誤的方法。每個'password_hash()'調用你將得到一個不同的鹽度散列。它永遠不會匹配數據庫內容。 – mario 2014-11-08 05:43:14