2

データベースにパスワードを保存するのは初めてで、読んだことから、以下の簡単なphpスクリプトを作成しました

<?php
  $salt =  openssl_random_pseudo_bytes (16);
  $password = "test";
  $hash = hash ("sha512" , $salt . $password);

  echo $hash;
?>
  1. 私はこれを正しくやっていますか?
  2. ソルトをバイトデータ型としてデータベースに保存する必要がありますか?
  3. 最終的なハッシュは、データベースの String データ型で格納する必要がありますか?
4

3 に答える 3

1

SHA* アルゴリズムは速すぎるため、パスワードのハッシュには適していません。代わりに、BCrypt や PBKDF2 のような遅いアルゴリズムを、必要な時間を制御するコスト ファクターと共に使用する必要があります。

PHP は、新しい関数password_hash()で BCrypt アルゴリズムをサポートします。以前の PHP バージョン用の互換パックもあります。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

独自のソルトを渡すのではなく、オペレーティング システムのランダム ソースから暗号的に安全なソルトを関数に作成させることをお勧めします。

ソルトは結果のハッシュ値に含まれるため、個別に保存する必要はありません。データベースに 60 文字の文字列フィールドを作成し、ハッシュ値を保存するだけです。この関数password_verify()は、保存されたハッシュ値から使用されたソルトを抽出します。詳細については、パスワードの保存に関する私のチュートリアルをご覧ください。

于 2014-07-21T11:16:20.673 に答える
-2

通常、ハッシュされたパスワードでソルトを保存しました。ハッシュ化されたパスワードからソルトフォームを認識するための独自の形式があります。たとえば、ハッシュされたパスワードは 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 で、salt は aaabbb です。ハッシュ化されたパスワードにソルトを追加します。したがって、最後の 6 単語がこのハッシュ化されたパスワードのソルトであることがわかります。データベースがハッキングされたとしても、彼らはまだソルトと実際のパスワードを知りませんでした。

于 2014-07-21T10:16:29.540 に答える