0

これはデータベースに保存されます。このデモ パスワードをユーザーに送信するにはどうすればよいですか? これ ($2y$10$Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls.) を通常のテキストに変換できません。

解決策はありますか?また、ランダムなパスワードを送信できません。

demo = $2y$10$Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls.

パスワードのチェックと生成に使用した関数を次に示します。

function password_encrypt($password) {
  $hash_format = "$2y$10$";   // Tells PHP to use Blowfish with a "cost" of 10
  $salt_length = 22;                    // Blowfish salts should be 22-characters or more
  $salt = generate_salt($salt_length);
  $format_and_salt = $hash_format . $salt;
  $hash = crypt($password, $format_and_salt);
    return $hash;
}

function generate_salt($length) {
  // Not 100% unique, not 100% random, but good enough for a salt
  // MD5 returns 32 characters
  $unique_random_string = md5(uniqid(mt_rand(), true));
    // Valid characters for a salt are [a-zA-Z0-9./]
  $base64_string = base64_encode($unique_random_string);
    // But not '+' which is valid in base64 encoding
  $modified_base64_string = str_replace('+', '.', $base64_string);
    // Truncate string to the correct length
  $salt = substr($modified_base64_string, 0, $length);
    return $salt;
}

function password_check($password, $existing_hash) {
    // existing hash contains format and salt at start
  $hash = crypt($password, $existing_hash);
  if ($hash === $existing_hash) {
    return true;
  } else {
    return false;
  }
}
4

1 に答える 1

0

新しいパスワードを生成してユーザーに送信することは、パスワードの回復には適していません。代わりに、ランダムな独立したコードを含むリンクをユーザーに送信し、このコードをデータベース (ハッシュ) に保存します。ユーザーがリンクをクリックしたら、新しいパスワードを入力させます。その場合、古いパスワードを知る必要はありません。ユーザーは、電子メール (電子メール アドレス) を読むことができたときに認証されます。

パスワードを忘れた場合のフォームは、誰でも投稿できます。誰かがあなたのメールアドレスを入力して、パスワードがすぐに変更されたら、嬉しくないでしょう。リンクを取得すると、メールを無視するか、本当にパスワードを変更するかを確認する機会があります。

ご指摘のとおり、パスワードはハッシュとして保存する必要があるため、取得できません。パスワードのハッシュがデータベースに保存されるとすぐに、実際のパスワードを知る必要はなくなります。後でパスワードが必要になったときはいつでも、ユーザーがパスワードを入力したのでわかります。

BCrypt ハッシュを生成するには、PHP 関数password_hash()を使用することをお勧めします。以前の PHP バージョン用の互換パックもあります。特に塩の発生は、そこではるかによく解決されます。

PSあなたが説明したハッシュはBCryptと呼ばれ、双方向暗号化に使用されるフグ暗号に基づいています。

于 2013-08-19T11:02:35.243 に答える