2017-02-11 28 views
0

驗證密碼,在這個項目中,我使用BCRYPT進行哈希過的口令不能在PHP

在登錄時,用戶沒有任何錯誤或任何正常登錄,但試圖改變時您的密碼,您的當前密碼與之相匹配的密碼數據庫

這裏是我的代碼片斷(當然我使用password_verify()驗證兩個密碼):

$option = ['cost' => 12]; 
    $password = password_hash($_currentpassword, PASSWORD_BCRYPT, $option); 

    $selectpasswordsql = "SELECT `password` FROM `auth` WHERE username=?"; 
    $selectpasswordstmt = $conn->prepare($selectpasswordsql); 
    $selectpasswordstmt->execute(array($_SESSION['account']['username'])); 
    $selectpasswordresults = $selectpasswordstmt->fetch(PDO::FETCH_ASSOC); 

    $databasepass = $selectpasswordresults['password']; 
    $databasepass = trim($databasepass); 
    if(password_verify($password,$databasepass)){ 
    if(empty($passmsgs)){ 
     $updatepasssql = "UPDATE `auth` SET 
     `password`=? 
     WHERE username=? 
     "; 
     $updatepassstmt = $conn->prepare($updatepasssql); 
     $updatepassstmt->execute(array($password, $_SESSION['account']['username'])); 
     if($updatepassstmt){ 
     array_push($passmsgs, 'Successfully updating your password!'); 
     } else { 
     array_push($passmsgs, 'There was a problem executing your command!'); 
     } 
    } 
    } else { 
    array_push($passmsgs, 'Your current password is wrong!'); 
    } 

嘗試了這一點,將導致不符合密碼


編輯符合您當前密碼的錯誤:是的,我用VARCHAR

編輯2的最大長度:這是我的代碼的完整副本link

回答

3

你不需要在第二行中散列你的$_currentpassword變量。

只要將變量傳遞給password_verify函數,函數本身就可以完成這項工作。

+0

password_verify會散列我的'current_password',所以確實需要它。你爲什麼認爲這不需要? – astronomicalXoom

+0

我添加了一個鏈接來查看我的整個代碼,如果您需要 – astronomicalXoom

+0

'password_varify'完成它需要做的事情,它不需要在外部散列密碼。 只需從數據庫傳遞用戶提交的密碼和舊密碼,它應該可以工作。 更多:[password_varify](http://php.net/manual/en/function.password-verify.php) –