web-dev-qa-db-ja.com

パスワード保存用のsha256 + saltハッシュはどの程度安全ですか

crackstation などのこのページのような複数のサイトで最近パスワードハッシュについて読み始めましたが、私が理解していることについては、md5やsha1などのハッシュアルゴリズムを使用しないようにする必要があります。塩でsha256を使用する必要があります。しかし、phpマニュアルの this ページを読んだ後、sha256の使用も推奨されておらず、代わりにpassword_hash()関数の使用を推奨していることに気付きました。また、この記事/ページのほとんどが2011〜13の間隔で記述されていることにも気づきました。そのため、今日のsaltを使用したsha256ハッシュパスワードの安全性や、Webアプリケーションで使用する必要があるかどうかはわかりません。

21
Yuran Pereira

汎用ハッシュは、10年以上にわたってパスワードに使用されなくなっています。問題は、それらが高速で、パスワードのエントロピーが低いことです。つまり、ブルートフォースはany汎用ハッシュを使用すると非常に簡単です。 PBKDF2、bcrypt、scryptなど、意図的に遅い関数を使用する必要があります。ページ全体を読むと、実際にCrackstationはこれを説明します。一方、MD5とSHA-1は、パスワードハッシュのコンテキストではSHA-2よりも弱くありません。それらの弱点はパスワードには関係ありません。

28
cpast

@cpastが言うように、単一のSHA-256の主な問題は、速すぎることです。既製のゲームGPUを使用する攻撃者は、毎秒10億でカウントされるレート(アメリカの10億ですが、それでもまだロット)。

別の問題は、物事を不適切に組み合わせる可能性があることです。 SHA-256はハッシュ関数です:one入力を受け取り、出力を生成します。 SHA-256にパスワードを指定してフィードする場合、SHA-256に基づいて独自の暗号化プロトコルを定義していることになります。 、パスワードとソルトを組み合わせてSHA-256入力を作成する方法を示す追加情報。特にセキュリティの信頼できるテストがないため、暗号プロトコルの設計は難しいことが知られています。あなたが正しくやったかどうかはわかりません。 (まあ、あなたのサーバーがあなたが聞いたことがない十数の異なる国から接続しているハッカーの完全なパーティーのホストになったとき、あなたはあなたがそうしたことを知っています間違った、しかし、それは少し遅すぎます...)

適切なパスワードハッシュには理論があります。 この答え を主題の入門書として読んでください。

20
Thomas Pornin

sha256はパスワードをハッシュするようには設計されていません。パスワードをハッシュするには、この用途のために作成されたハッシュ関数を使用することをお勧めします。以下の必要な情報はすべて、同様のリクエストに対応する別の質問で確認できます: 最も安全なパスワードハッシュアルゴリズム? .

上記の質問では、sha256のような汎用ハッシュ関数がパスワードを安全に保管するための適切なプロパティを持たない理由を学びます(それ自体に何度も適用された場合でも)。また、安全なパスワード処理専用の最も推奨されるハッシュ関数:

  1. scrypt :これはまだかなり新しい(2012年に公開された)が、以前のbcryptよりも優れたセキュリティを確保するように設計されています。
  2. bcrypt :パスワードの保存用に特別に設計され、長い間推奨されていました。
  3. PBKDF2 :実際にはキーストレッチ機能として設計されています。与えられたパスワードから暗号化キーを導出する安全な方法ですが、その特性により、パスワードの保存にも適しています。

あなたの質問では、PHP関数 password_hash() について言及しました。この関数自体は、ハッシュアルゴリズムではありません。実際、この関数は、コードを変更せずにPHPが利用可能な最も信頼できるパスワードハッシュアルゴリズムを選択できるようにするために使用されます。

ドキュメントに示されているように、PHP 5.5.0に従って、デフォルトでbcryptが選択されています。

10
WhiteWinterWolf