2017-02-03 10 views
1

問題があります。データベースからSALT-Valueを取得すると、ハッシュされたパスワードとデータベースのパスワードが一致しません。パスワードの最後にそれを追加するために、ランダムな塩を生成するSQL-DatabaseでPHPが生成した塩は、そこから取得したときに等しくない

register.php

  1. 完全な値をハッシュします。
  2. ユーザー名、ハッシュパスワード、および塩をデータベースに挿入します。

    login.php

    1. 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()); 
      } 
      

    パスワードの最後にそれを追加するために、データベースからのデータ(塩)を取得します。
  3. 完全な値をハッシュします。
  4. パスワードの値が等しいかどうかを確認します。あなたはpassword_hash()を使用する必要があります

$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パスワードlibを使用してください。はるかに安全な、はるかに安全 – JimL

答えて

0

。それはあなたのための塩を処理し、ハッシュされたパスワードにそれを追加します。次に、password_verify()を使用して、パスワードが有効であることを確認します。

また、パスワードをループでハッシュする必要はありません。

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

これはちょうどあなたのハッシュされたパスワードが同じでない理由は、文字かもしれ

を、)(128回ハッシュを呼び出し、同じ結果を毎回取得、および$ PASSWORDに代入されますエンコードの問題。 PHPとSQLの両方が同じエンコーディングを使用するように設定されていることを確認してください。ここにはかなり良い記事がありますhere

+0

ねえ、ありがとうあなたの答えのためにたくさん! 私はpassword_hash()を使用しましたが、パスワードを確認するためにif-Statementを使用しました。正しいpassword-hashでは、password_verify()でログインに失敗したためです。 他の質問、私はあなたに答えがあることを望みます:BCRYPTは1999年以来実行しています.Argon2のような他のアルゴリズムをpassword_hash()で使用できますか? – Graphity

+0

私は理解できません。コードを投稿できますか?ハッシュアルゴリズムについては、現在サポートされているのはBCRYPTだけです。 'password_hash( 'secret'、PASSWORD_DEFAULT)'を使って、デフォルトのハッシュアルゴリズムを使うことができます。これは現在BCRYPTですが、将来Argon2などがサポートされると変更される可能性があります – Siege

関連する問題