10

PHP 5.5 の新しい password_hash API は素晴らしいので、どこでも使い始めたいと思っています。パスワードが md5 ハッシュに保存されている古いデータベースを使用する古いプロジェクトの場合、古いユーザー パスワードを新しいより安全な API に移行するための最良の方法は何ですか?

次回のログイン時にパスワードをリセットするようユーザーに促すだけでなく (これは非現実的であり、ユーザーにとって迷惑です)、現在の md5 ハッシュを既存のすべてのユーザーの password_hash() への入力として使用する可能性について考えました。これらのユーザーのパスワードを (ログイン中に) 検証するには、入力を md5 ハッシュに変換し、それを password_verify() に使用します。新規ユーザーは、この余分な手順を省略できます。

これはこれを行う価値のある方法ですか?ユーザーがパスワードのリセットについてしつこくなくても、より安全なハッシュの利点をすぐに享受できる、透過的な移行のためのより良い方法はありますか?

最も重要なのは、既存の md5 ハッシュ (ブルート フォース攻撃を受けやすい) を取得し、password_hash() API を使用してそれを「ダブル ハッシュ」することには、セキュリティ上の利点もありますか?

4

3 に答える 3

13

login.php(?) では、古いパスワードを MD5 から bcrypt に変換し、データベース内の古い MD5 ハッシュを新しいものに置き換えます。

擬似コード:

$password = $_POST["password"];

if (substr($pwInDatabase, 0, 1) == "$")
{
    // Password already converted, verify using password_verify
}
else
{
    // User still using the old MD5, update it!

    if (md5($password) == $pwInDatabase)
    {
        $db->storePw(password_hash($password));
    }
}

bcrypt自体は一方向ハッシュ関数であるため、二重ハッシュはbcryptのセキュリティを向上させません。

注: MD5 は 32 文字の長さの文字列を生成しますpassword_hash()が、最小長は 60 文字です。

マニュアルを読む:

password_hash()または互換パック (PHP < 5.5 の場合) https://github.com/ircmaxell/password_compat/を使用する場合、現在のパスワード列の長さが 60 未満の場合は、それ(またはそれ以上)に変更する必要があります。マニュアルでは 255 の長さを推奨しています。

有効にするには、列の長さを変更し、新しいハッシュでやり直す必要があります。そうしないと、MySQL は暗黙のうちに失敗します。

于 2013-09-20T00:03:38.227 に答える
2

これは一方向の暗号化であるため、安全ではないログイン ページでユーザーのパスワードが必要でない限り、ユーザーにパスワードを再入力させることができます。もう 1 つのオプションは、すべてのデータベース レコードをハッシュ化されたパスワードpassword_hash()の上に再暗号化しmd5()、それらの値をデータベースに保存することです。次に、ログイン PHP ページで、次のようにpassword_hash()を前後に置きます。md5()

password_hash(md5($_POST['password']));

2 番目の方法を使用すると、ユーザーにパスワードをリセットしてもらう必要はありません。

于 2013-09-20T00:09:00.657 に答える