0

だから私はPHPを学んでいて、ログインページに取り組んでいます。SHA256を使用して$salt+$passwordをハッシュする新しいユーザーを登録する方法はすでに理解しています。bcryptのような遅い暗号化方法があることは知っていますが、学習目的では、SHA256を使用しています。私の質問は、これを使用して暗号化した後です:

function HashPassword($password) {
  $salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); 
  $hash = hash("sha256", $salt . $password); column
  $final = $salt . $hash;
  return $final;
}

プリペアドステートメントを使用して、データベースからハッシュパスワードを取得し、このような関数を使用して検証できるようにするための最良の方法は何ですか?

function ValidatePassword($password, $hash_pass) {

  $salt = substr($hash_pass, 0, 64); 
  $trueHash = substr($hash_pass, 64, 64); 
  $reHash = hash("sha256" , $salt . $password); 

  return $reHash == $trueHash;
}
4

2 に答える 2

5

原則として、パスワードを取得することはできません。代わりに、同じHashPassword関数を使用してパスワード試行のハッシュを計算し、データベースに一致するレコードを照会します。


編集

関数をもう一度見てみるとHashPassword、ランダムなソルトを生成するのではなく$salt、引数として使用する必要があることがわかりました。必要に応じて、既存のデータベースレコードから値を渡すか、ランダムに生成された値を渡します。

于 2012-04-27T07:25:13.453 に答える
1

基本的に、パスワードをソルトでハッシュして保存し、認識できないようにします。

ある時点でデータベースがハッキングされた場合、ハッカーはパスワードを直接読み取ることができません。代わりに、ハッシュ値を再作成する必要があります。

ユーザーごとに異なる(ランダムな)ソルトを使用しない場合、ハッカーはすべての可能なハッシュ値を使用して1つのテーブルを作成し、それを保存されたハッシュパスワードと比較するだけで済みます。

ただし、パスワードごとに異なるソルトがパスワードに追加されている場合、ハッシュする前に、ハッカーは単一のパスワードごとに新しいテーブルを作成する必要があるため、実際のパスワードを取得するために必要な労力が大幅に増加します。これがハッカーにとって非効率的またはコストがかかりすぎることを期待しています。

ログインクレデンシャルを検証するコーダーとして、次のパターンに従う必要があります。

  1. データベースに保存されているソルトを取得します。
  2. 連結された値を計算しますhash = salt + password
  3. 計算されたものと保存されたものを比較しますhash === savedHash
  4. それらが同じである場合、それは有効なパスワードでした。そうでない場合は、間違ったパスワードでした。
于 2012-04-27T07:34:15.813 に答える