2017-02-03 65 views
1

我遇到問題。當我從數據庫中檢索SALT-Value時,我的哈希密碼與我數據庫中的密碼不相等。在SQL數據庫中生成的鹽在從那裏檢索時不等於

register.php

  1. 生成隨機鹽,將其添加到所述密碼的末尾。
  2. 哈希值。
  3. 在數據庫中插入用戶名,散列密碼和salt。

while($row){ 
    $SALT = random_bytes(32); 
    $SALT = bin2hex($SALT); 

    $query = "SELECT 1 FROM usr_accounts WHERE SALT = :SALT"; 
    $query_params = array(':SALT' => $SALT); 
    try{ 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex){ 
     die("Failed to run query: " . $ex->getMessage()); 
    } 
    $row = $stmt->fetch(); 
    if(empty($row)){ 
     break; 
    } 
} 

for($hashnr = 0; $hashnr < 128; $hashnr++){ 
    $PASSWORD = hash('sha256', $_POST['PASSWORD'].$SALT); 
} 

$query = "INSERT INTO usr_accounts (USERNAME, PASSWORD, SALT, EMAIL) VALUES (:USERNAME, :PASSWORD, :SALT, :EMAIL)"; 
$query_params = array(':USERNAME' => $_POST['USERNAME'], ':PASSWORD' => $PASSWORD, ':SALT' => $SALT, ':EMAIL' => $_POST['EMAIL']); 
try{ 
    $stmt = $db->prepare($query); 
    $result = $stmt->execute($query_params); 
} 
catch(PDOException $ex) 
{ 
    die("Failed to run query: " . $ex->getMessage()); 
} 

的login.php

  1. 檢索來自數據庫中的數據(鹽),將其添加到所述密碼的末尾。
  2. 哈希值。
  3. 檢查密碼值是否相等。

$query = "SELECT ID, USERNAME, PASSWORD, SALT FROM usr_accounts WHERE USERNAME = :USERNAME"; 
$query_params = array(':USERNAME' => $_POST['USERNAME']); 
try{ 
    $stmt = $db->prepare($query); 
    $result = $stmt->execute($query_params); 
} 
catch(PDOException $ex){ 
    die("Failed to run query: " . $ex->getMessage()); 
} 
$login_ok = false; 

$row = $stmt->fetch(); 
if($row){ 
    for($hashnr = 0; $hashnr < 128; $hashnr++){ 
     $check_password = hash('sha256', $_POST['PASSWORD'].$row['SALT']); 
    } 
} 

+0

只需使用內置的PHP密碼庫。更安全,更容易 – JimL

回答

0

您應該使用password_hash()。它爲你處理鹽並將其添加到哈希密碼中。然後使用password_verify()檢查密碼是否有效。

此外,您不需要在循環中散列密碼。

for($hashnr = 0; $hashnr < 128; $hashnr++){ $PASSWORD = hash('sha256', $_POST['PASSWORD'].$SALT); }

這僅僅是調用哈希()128次,每次得到相同的結果,並將其分配給$ PASSWORD

的原因,您的哈希密碼是不一樣的可能是一個字符編碼問題。確保PHP和SQL都設置爲使用相同的編碼(如果UTF8取決於您,則編碼)。這裏有一篇相當不錯的文章here

+0

嘿,非常感謝你的回答! 現在我使用password_hash(),但要檢查密碼,我使用if-Statement,因爲使用password_verify()時,登錄再次失敗,雖然密碼哈希正確。 另一個問題,我希望你有一個答案:BCRYPT自1999年以來運行。我可以使用其他算法,如密碼_hash()與Argon2? – Graphity

+0

我不確定我是否理解,你能發佈你的代碼嗎?至於哈希算法,我很肯定BCRYPT是目前唯一支持的。您可以使用'password_hash('secret',PASSWORD_DEFAULT)'使用默認的哈希算法。這是目前BCRYPT,但在未來,當支持Argon2或其他東西時,它可能會改變 – Siege

相關問題