web-dev-qa-db-ja.com

sha1を使用してパスワードを保存する

データベースにパスワードを挿入する前に、sha1()関数を使用してパスワードをハッシュしています。しかし、私はこの手順を実行して、ハッシュされるパスワードにならないようにします。

私のページでは、ユーザーをパスワードとともに登録します。送信後、最初にユーザー名をデータベースに入力し、次にそのユーザー名の一意のIDを取得します。次に、システムはそれをパスワードと組み合わせます。

_$password = $userid.$password;
_

次に、sha1()を使用してパスワードをハッシュします。

_$password = sha1($password);
_

次に、データベース内のパスワードをそのIDで更新します。

ユーザーIDをソルトのように使用しました。

質問

これは良いテクニックですか?システムの利用者は当社の他の部署だけですが、私の意見ではそれで十分だと思います。

また、将来的にパスワードのセキュリティを強化する必要のある大規模なプロジェクトがある場合、これで十分でしょうか?ありがとう!

6
Logan Wayne

ソルトは他の既知のパラメータから派生すべきではありません。ソルトはグローバルに一意である必要があります。したがって、できる最善の方法は、各パスワードに対して本当にランダムなソルトを生成することです。今日のオペレーティングシステムには「ランダムソース」がありますが、確定的コンピューターでは、このランダムソース(DEV_URANDOM)から読み取るのが最善です。

これに加えて、SHA- *ハッシュファミリーはパスワードをハッシュするのに適していません。これは、このアルゴリズムが速すぎるため、ブルートフォースを簡単に実行できないためです( Giga SHA1/s )。代わりに、BCrypt、PBKDF2、SCryptなどのコスト係数のある遅いキー派生関数を使用する必要があります。

PHPの場合、パスワードをハッシュするための専用関数が存在します。これはある方法で設計されているため、将来必要に応じてアルゴリズムを変更できますが、古いハッシュを検証できます。

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

// 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);

// This way you can define a cost factor (by default 10). Increasing the
// cost factor by 1, doubles the needed time to calculate the hash value.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
15
martinstoeckli

あなたがしていることであなたがしていることには2つの問題があります:

  • その単純な形式のアルゴリズムは高速ですであるため、パスワードハッシュには適していません。 (パスワードハッシュアルゴリズムに必要なプロパティは、1回実行するのに十分高速ですが、数回実行する必要がある場合は遅く、FPGA/ASICまたはGPUで実行すると使いづらくなります。
  • 塩味が悪い。ソルトはグローバルに一意である必要があります。つまり、非常に珍しいレベルのランダム性があり、世界中のどこかでソルトとして発生した可能性はありません。これは、ユーザーが自分のユーザー名を再利用する可能性が高いため、いくつかのデータベースが漏洩した場合の攻撃を防ぐためです。したがって、ユーザー名をソルトとして使用することはお勧めしません。ユーザー名がデータベースに固有である可能性があるため、同じ原理を使用する別のデータベースに対しては使用されないためです。

現在受け入れられているアルゴリズムは、bcrypt、scrypt、pbkdf2の3つです。

6
Lucas Kauffman

SHA1の欠点は、高速であるため、レインボーテーブルを作成してブルートフォースするのが簡単です。ソルトを追加すると役立ちますが、パスワードが弱い場合は、「数字+弱いパスワード」がパスワードとともにRainbowテーブルにある可能性があります。

PHPは 組み込みのパスワードメカニズム を提供します。これらを使用すると、crypt関数が自動的にソルトを生成します ハッシュされたパスワード+塩とともに保存
これは、PHPで(ソルト化された)パスワードハッシュを使用する推奨方法です。