2

ユーザーがパスワードを挿入できる登録ページがあるので、データベースでより安全になるようにハッシュする必要があります。これは正常に機能します

しかし、ログインに関しては、入力されたパスワードが登録されたものと一致しませんこの問題を解決する方法mm

ハッシュを使用するのはこれが初めてなので、思い通りに機能しませんでした

これは、ハッシュの登録コードです。

   //ADD MD5 hash to the password 
function cryptPass($input, $rounds = 9)
{
    $salt = "";
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
    for($i = 0; $i<22; $i++)
    {
        $salt  .=$saltChars[array_rand($saltChars)]; 
    }
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass1);      
echo $hashedpass;

ハッシュパスワード = $2y$09$test$5I9x8HWhA4UHi5TMu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e

これは、ハッシュのログイン コードです。

   function cryptPass($input, $rounds = 9)
{
    $salt = "";
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
    for($i = 0; $i<22; $i++)
    {
        $salt  .=$saltChars[array_rand($saltChars)]; 
    }
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass);   
echo $hashedpass;

ハッシュパスワード = $2y$09$test$4ZGgCiXdKzgQvuzwu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e

4

2 に答える 2

1

登録すると、一意のソルトが作成されます。そのソルトはハッシュの一部になりました。よく見ると、ハッシュの最初の部分に埋め込まれていることがわかります。パスワードを確認するには、以前にハッシュされたパスワードのソルトを使用するため、同じソルトを再度使用しています。

$correctPasswordHash = getPasswordFromDatabase($_POST['username']);
$hash = crypt($_POST['password'], $correctPasswordHash);

if ($correctPasswordHash === $hash) ...

これを簡単かつ確実に行うには、password_compat ライブラリーを使用します。このライブラリーは、これを使いやすい API にラップします。これは、PHP の将来のバージョンにも統合される予定です。crypt注意が必要な落とし穴がいくつかあるため、ソース コードを調べて の正しい使用法を確認してください。===また、password_compat ライブラリは、単純なタイミング攻撃を阻止する代わりに、カスタム バイナリ比較を使用しています。

于 2013-05-19T06:40:29.680 に答える
0

あなたのコードを正しく理解していれば、ログイン時のコードは、パスワードと共に保存されているものを無視して、新しいソルトを生成しています。異なるソルトを使用して同じパスワードをハッシュすると、異なるハッシュが生成されます。

@c2の回答に従って、一定の塩 コショウを使用します(この回答の一番下までスクロールします):

function cryptPass($input, $rounds = 9)
{
  return crypt($input, sprintf('$2y$%02d$mysalt$', $rounds));
}
$hash = cryptPass($pass);   

または、両方の回で同じソルトを使用します。

// Login time (register-time code is unchanged)
function cryptPass($input, $salt, $rounds = 9)
{
  return crypt($input, sprintf('$2y$%02d$%s$', $rounds, $salt));
}
function checkPass($freshPass, $hashFromDatabase) {
  $salt = explode('$', $hashfromDatabase, 5);
  $salt = $salt[3];
  return cryptPass($freshPass, $salt) === $hashFromDatabase;
}
于 2013-05-19T06:19:58.580 に答える