2014-11-03 41 views
6

我通過password_hash散列我插入的密碼。我通過使用password_verify來驗證它們。password_verify不驗證散列

但是,當我在我的數據庫中插入散列密碼並嘗試驗證它時,兩個輸出總是不同。

我的頁面,如下圖所示

main_login.php(形式):

<?php include 'header.php';?> 
<body> 
<form role="form" method="post" action="login.php"> 
    <div class="form-group"> 
    <label for="usrname">Username:</label> 
    <input type="text" class="form-control" name="usrname" placeholder="Enter username"> 
    </div> 
    <div class="form-group"> 
    <label for="passwrd">Password:</label> 
    </div> 
    <input type="password" class="form-control" name="passwrd" placeholder="Enter password"> 
    <br> 
    <input type="checkbox">Remember Me 
    <br> 
    <br> 
    <button type="submit" class="btn btn-default">Submit</button> 
</form> 
</body> 
</html> 

login.php中(處理):

<?php 
include 'vars.php'; 
include 'header.php'; 
$sql="SELECT * FROM members WHERE usrname='$usrname'"; 
$result=mysqli_query($con,$sql); 
$count=mysqli_num_rows($result); 
$row=mysqli_fetch_row($result); 
$verify=password_verify($hash,$row[2]); 
if($verify){ 
    $_SESSION["usrname"]=$usrname; 
    echo "Correct"; 
} 
else { 
    echo "user: " . $usrname. "<br>"; 
    echo "pass: " . $hash. "<br>"; 
    echo "db: " . $row[2]."<br>"; 
    echo "Wrong Username or Password"; 
} 
?> 

vars.php:

<?php 
$h='localhost';$u='caelin';$p='****';$d='ombouwnh'; 
$con=mysqli_connect($h,$u,$p,$d); 
$usrname=$_POST['usrname']; 
$passwrd=$_POST['passwrd']; 
$hash=password_hash($passwrd, PASSWORD_DEFAULT); 
?> 

當我嘗試登錄使用用戶名'caca'和密碼'caca'我得到不同的輸出,每次我重試。 我無法在stackoverflow上找到此特定問題。

TIA

PS。如果您需要更多詳細信息,請諮詢他們

+4

確保列的長度足夠長以容納散列;這通常是很多人犯的錯誤。 – 2014-11-03 19:43:27

+1

它是varchar(255)@ Fred-ii- – caelin 2014-11-03 19:43:45

+0

'$ row [2]'確保該數字是正確的。這確實是表格中的第3列,對嗎?另外你有'session_start();'加載,對吧? '$ _SESSION [「usrname」]'可能無關緊要。 – 2014-11-03 19:45:51

回答

11

函數password_verify();需要兩個參數;非散列輸入和存儲的散列進行比較。它會自動散列非散列輸入以將其與存儲的版本進行比較。所以你的初始代碼重新哈希已經哈希的密碼。應該是這樣的:

$verify=password_verify($_POST['passwrd'],$row[2]); 

if($verify){ 
    $_SESSION["usrname"]=$usrname; 
    echo "Correct"; 
} 
else { 
    echo "user: " . $usrname. "<br>"; 
    echo "pass: " . $hash. "<br>"; 
    echo "db: " . $row[2]."<br>"; 
    echo "Wrong Username or Password"; 
} 
+2

去安德魯的路。我很高興OP得到了解決方案。我問OP,在我看到你的評論之前,他/她是否希望我張貼我自己使用的東西。總是最好與OP的代碼一起工作,找到解決實際問題的解決方案,而不是別人的代碼。 *乾杯* +1 – 2014-11-03 20:05:19

3

你改頭換面的密碼 - 只是通過明文密碼和哈希值(從DB)到password_verify和它的作品。

+0

它已在20分鐘前回答,並被接受;謝謝。 – 2014-11-03 20:29:03

+0

對不起,打開了該問題並鍵入了答覆,但無法發佈,直到我的wifi連接得到修復(for – Djordje 2014-11-03 20:31:42