パスワードをデータベースにハッシュするにはどのようなアルゴリズムを使用すればよいですか?[重複]

StackOverflow https://stackoverflow.com/questions/116684

質問

この質問にはすでに答えがあります:

ありますか 何でも 簡単に壊れないものは入手可能ですか?

役に立ちましたか?

解決

この 2008 年の回答は現在では危険なほど時代遅れです。 SHA (すべてのバリアント) は現在では簡単に解読可能であり、現在 (2013 年 1 月現在) のベスト プラクティスは、キー ストレッチ ハッシュ (PBKDF2 など) または理想的には RAM を大量に使用するハッシュ (PBKDF2 など) を使用することです。 Bcrypt)、ユーザーごとのソルトも追加します。

ポイント 2、3、4 は依然として注目に値します。

を参照してください。 ITセキュリティSEサイト 多くのための。


2008 年の元の回答:

  1. 実績のあるアルゴリズムを使用します。SHA-256 はデータベース内で 64 文字を使用しますが、列にインデックスがあるため問題はありません。また、SHA-256 は実績のあるハッシュであり、MD5 や SHA-1 よりも信頼性が高くなります。また、標準セキュリティ スイートの一部としてほとんどの言語に実装されています。ただし、SHA-1 を使用しても心配する必要はありません。

  2. パスワードをハッシュ化するだけでなく、他の情報も含めてください。パスワードだけではなく、「ユーザー名:パスワード:ソルト」などのハッシュを使用することがよくありますが、これをいじると、辞書攻撃を実行することがさらに難しくなります。

  3. セキュリティは難しい分野です。独自のアルゴリズムやプロトコルを発明できるとは考えないでください。

  4. 「[AddUser] GeorgeBush:Rep4Lyfe:ASOIJNTY のハッシュは xyz です」のようなログを書き込まないでください。

他のヒント

暗号化とパスワード保存の最初のルールは「自分で発明しないでください」 しかし、そうしなければならない場合、セキュリティを確保するために最低限行うべきことは次のとおりです。

基本的なルール:

  1. プレーンテキストのパスワードは決して保存しないでください (つまり、パスワードを表示したり送信したりすることはできません)。
  2. 保存されたパスワード表現を、安全でない回線 (プレーン テキスト、エンコード、またはハッシュのいずれか) を介して送信しないでください。
  3. スピードは敵です。
  4. 定期的に再分析し、 プロセスを改善する ハードウェアと暗号解析が向上するにつれて。
  5. 暗号化とプロセスは、 非常に少ない 解決策の一部。
  6. 障害点には次のようなものがあります。ストレージ、クライアント、送信、処理、ユーザー、法的令状、侵入、および管理者。

手順:

  1. 適切な最低限のパスワード要件を強制します。
  2. パスワードは頻繁に変更してください。
  3. 入手できる最強のハッシュを使用します - SHA-256 ここで提案されました。
  4. パスワードとを組み合わせます。 固定塩 (データベース全体についても同様です)。
  5. 前のステップの結果を結合します。 独特の塩 (ユーザー名、レコード ID、GUID、長い乱数など) が保存され、このレコードに添付されます。
  6. ハッシュ アルゴリズムを複数回実行します - 1000回以上のように. 。理想的には、前のハッシュに毎回異なるソルトを含めます。速度は敵であり、複数の反復により速度が低下します。場合によっては反復回数が 2 倍になります (これには新しいハッシュを取得する必要があります。次回パスワードを変更するときに実行してください)。

ああ、SSL またはその他の回線セキュリティを実行している場合を除き、パスワードが平文で送信されることを許可しないでください。また、クライアントからの最終ハッシュと保存されたハッシュを比較するだけの場合は、それをプレーン テキストで送信することも許可しないでください。クライアントにノンス(一度使用される数値)を送信し、生成されたハッシュ(上記の手順を使用)でそれをハッシュしてもらい、それを送信する必要があります。サーバー側で同じプロセスを実行し、2 つのワンタイム ハッシュが一致するかどうかを確認します。その後、それらを処分してください。もっと良い方法がありますが、それが最も簡単な方法です。

昨年、CodingHorror にこれに関する素晴らしい記事がありました

http://www.codinghorror.com/blog/archives/000953.html

記事の最後にある推奨事項は BCrypt です

前述のアルゴリズムは、暗号的に安全なハッシュ アルゴリズムです (ただし、MD5 は現在安全であるとは考えられていません)。

ただし、パスワードからキーを導出するために特別に作成されたアルゴリズムがあります。これらは、 主要な導出関数. 。これらは対称暗号で使用するように設計されていますが、パスワードの保存にも適しています。 PBKDF2 たとえば、ソルト、多数の反復、優れたハッシュ関数を使用します。ライブラリがある場合、それを実装するもの (例:.NET)を検討してみると良いと思います。

追加 独特の塩 ハッシュ化されたパスワード値に変換します (ソルト値をデータベースに保存します)。とき 独特の塩が使われている SHA1 や MD5 よりも安全なアルゴリズムを使用する利点は、実際には必要ありません (その時点では、ソルトの使用は画期的な改善ですが、その時点では段階的な改善です)。

MD5 や SHA1 などの強力な暗号化ハッシュ関数を使用しますが、必ず適切な暗号化ハッシュ関数を使用してください。 , そうしないと、次のような影響を受けやすくなります。 レインボーテーブル 攻撃します。

2013 年 1 月の更新

元の答えは 2008 年のもので、この 5 年間で状況が少し変わりました。クラウド コンピューティングと強力な並列プロセッサ グラフィックス カードがすぐに利用できるようになったことで、MD5 または SHA1 としてハッシュされた最大 8 文字または 9 文字のパスワードが簡単に破られるようになりました。

SHA512 のようなより強力なものと同様に、ロングソルトは必須です。

ただし、すべての SHA バリアント ハッシュは通信の暗号化、つまりすべてのメッセージが暗号化されるメッセージの送受信用に設計されているため、 速い.

パスワード ハッシュの世界では、ハッシュの生成が速くなるほど、大量のハッシュの生成にかかる時間が短縮されるため、この設計は大きな欠点となります。

SHA512 のような高速ハッシュは、1 秒間に数百万回、さらには数十億回生成されることがあります。安価な並列処理を投入すると、パスワードのあらゆる可能な置換が絶対的な必須になります。

キーストレッチはこれに対処する 1 つの方法です。キーストレッチ アルゴリズム (PBKDF2 など) は、より高速なハッシュ (SHA512 など) を何千回も適用するため、通常、ハッシュの生成には 1/5 秒程度かかります。ログインしている人は気づかないでしょうが、1 秒あたり 5 つのハッシュしか生成できない場合、ブルート フォース攻撃ははるかに困難になります。

第二に、 いつも ユーザーごとのランダムなソルトになります。これは最初のものとしてランダムに生成できます。 n ハッシュのバイト数 (その後、削除され、比較するハッシュを構築する前にチェックされるパスワード テキストに追加されます)、または追加の DB 列として。

それで:

パスワードをデータベースにハッシュするにはどのようなアルゴリズムを使用すればよいですか?

  • キーストレッチ ハッシュの生成を遅くします。おそらくPBKDF2を使うと思います。

  • ユーザーごとのソルト ユーザーごとに新たな攻撃が行われることを意味し、塩を入手する方法を考え出す作業も行われます。

コンピューティング能力と可用性は飛躍的に向上しています。これらのルールはさらに 4 年以内に再び変更される可能性があります。将来も保証されるセキュリティが必要な場合は、bcrypt/scrypt スタイルのハッシュを調査します。これらは、低速のキーストレッチ アルゴリズムを使用し、ハッシュを生成するために大量の RAM を使用するステップを追加します。RAM を大量に使用すると、安価な並列プロセッサの効率が低下します。

オリジナル 2008 年 9 月 (コメントが意味をなすように残しました)

MD5+ソルトまたはSHA1+ソルトは「簡単に壊れる」わけではありません - ほとんどのハッキングは巨大なレインボーテーブルに依存しており、ソルトを使用するとこれらのテーブルはあまり役に立たなくなります [update, now they are].

MD5+ソルトは比較的弱いオプションですが、簡単に壊れるわけではありません [update, now it is very easy to break].

SHA2 は 512 まで達します - これをすぐに入手できるキットで解読するのはかなり不可能です [update, pretty easy up to 9 char passwords now] - でも、どこかの軍用壕にそれができるクレイがいると思うよ [You can now rent this 'Cray' from Amazon]

MD5 または SHA とエントリごとにランダムに生成されたソルト値の組み合わせ

前述したように、単純なハッシュ アルゴリズムは使用すべきではありません。その理由は次のとおりです。

http://arstechnica.com/security/2012/08/passwords-under-assault/

したがって、次のような他のものを使用してください http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

すべてのハッシュ アルゴリズムは「辞書攻撃」に対して脆弱です。これは単純に、攻撃者が考えられるパスワードの非常に大きな辞書を持っており、それらをすべてハッシュ化する場所です。次に、それらのハッシュのいずれかが、復号化するパスワードのハッシュと一致するかどうかを確認します。この技術を使用すると、数百万のパスワードを簡単にテストできます。このため、遠隔から予測可能なパスワードは避ける必要があります。

ただし、辞書攻撃の脅威を受け入れるのであれば、MD5 と SHA1 はそれぞれ十分すぎるでしょう。SHA1 はより安全ですが、ほとんどのアプリケーションにとって、これは実際には大幅な改善ではありません。

MD5 / SHA1 ハッシュはどちらも良い選択です。MD5 は SHA1 よりわずかに弱いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top