2017-05-27 21 views
0

我有一個php(symphony)web應用程序和一個訪問同一數據庫的android應用程序。表中的密碼字段使用Bcrypt與交響樂加密,其值開始於$2y$13,我用這個代碼的PHP加密我的密碼在Android應用程序中輸入:

if(isset($_POST['password'])){ 
$password = $_POST['password']; 
$pas_hash= password_hash("$password", PASSWORD_BCRYPT); 
$sql = 'SELECT * FROM tbl_auth WHERE password = :pas_hash'; 
    $stmt = $conn->prepare($sql); 

     $stmt->bindParam(':pas_hash', $pas_hash, PDO::PARAM_STR); 
     $stmt->execute(); 
     if($stmt->rowCount()) 
     { 
     $result="true";  
     } 
     elseif(!$stmt->rowCount()) 
     { 
      $result="false"; 
     } 

     // send result back to android 
     echo $result; 

} 

的問題是,pas_hash值開始$2y$10,當我用password_verify(),這個函數返回true結果。 我沒有什麼問題,因爲發送到我的Android應用程序的最終$resultfalse。 謝謝。

+1

我沒有看到你使用'password_verify'在一切,儘管說。那是你的問題。 –

+2

這不是一個加密,它是一個散列。 –

+0

你也在使用錯誤的方法 –

回答

1

好的,所以if($stmt->rowCount())正在檢查行數是否爲空,但它不爲空,它是0,因爲你的結果返回0行。

將您的聲明更改爲if ($stmt->rowCount() > 0)並且應該修復它。

就個人而言,驗證用戶(?)的方式有點奇怪,最好是搜索用戶名,從數據庫獲取密碼,並使用password_verify對用戶提供的密碼和密碼你從數據庫中獲得。這可能不適合你的功能,但如果你願意,也可以從下面的代碼中獲得靈感。

例子:

if(isset($_POST['username'])){ 

     $username = $_POST['username'] // Or however you get the username. 
     $password = $_POST['password']; 
     $sql = 'SELECT * FROM tbl_auth WHERE username = :username'; 
     $stmt = $conn->prepare($sql); 
     $stmt->bindParam(':username', $username, PDO::PARAM_STR); 
     $stmt->execute(); 
     $result = $stmt->fetch(PDO::FETCH_ASSOC); 
     if(password_verify($password, $result['password']) 
     { 
     $result="true";  
     } 
     else 
     { 
      $result="false"; 
     } 
     // send result back to android 
     echo $result; 

} 
+0

您應該再仔細看看他們的代碼。編輯:你做了/編輯。 –

+0

我在想什麼Fred?我給了這個一次,但沒有運氣。編輯:哦,是的,你也指什麼? – MinistryofChaps

+0

當我看到您的編輯時,我編輯了我的評論。這應該對他們有用。讓我們看看他們是否會在這裏接受和/或評論。 –