web-dev-qa-db-ja.com

パスワードをハッシュするためのベストプラクティス-SHA256またはSHA512?

現在、SHA256とソルトを使用してパスワードをハッシュしています。 SHA256を引き続き使用する方が良いですか、またはSHA512に変更する必要がありますか?

26
econner

SHA512に切り替えても、Webサイトのセキュリティはほとんど向上しません。 独自のパスワードハッシュ関数を作成しないでください。代わりに、既存の実装を使用してください。

SHA256およびSHA512はメッセージダイジェストであり、neverはパスワードであることを意味していました-ハッシュ(またはキー派生)関数。 (メッセージダイジェストは、HMAC-SHA1を使用したPBKDF2のように、KDFのビルディングブロックとして使用できます。)

パスワードハッシュ関数は、辞書攻撃とレインボーテーブルから保護する必要があります。辞書攻撃を防ぐために、パスワードハッシュスキームmustには、実行可能な限り遅くするための作業要素が含まれています。

現在、最良の選択はおそらくArgon2です。このパスワードハッシュ関数ファミリは、2015年のパスワードハッシュコンペティションで優勝しました。

Argon2が利用できない場合、他の標準化されたパスワードハッシュまたはキー派生関数はPBKDF2のみです。これは古いNISTです標準。標準を使用する必要がない場合は、他の選択肢として、bcryptおよびscryptを含めます。

ウィキペディアには、これらの機能のページがあります。

51
Erwan Legrand

あなたが私に尋ねると、これはすでに十分に答えられています: https://stackoverflow.com/questions/3897434/password-security-sha1-sha256-or-sha512

ジェフにはハッシュに関する興味深い投稿もありました: http://www.codinghorror.com/blog/2012/04/speed-hashing.html

SHA512は、SHA256よりも計算がはるかに遅いことに注意してください。セキュアハッシュのコンテキストでは、これは資産です。ハッシュの計算が遅いと、クラッキングにかかる​​計算時間が長くなります。このため、コストSHA512はより安全です。

7
Yaniv

ほとんどの64ビットプロセッサでSHA256ses 32ビット数学として計算すると、SHA512は大幅に高速になる場合がありますが、これは多くの場合わずかに遅い操作です。

5
Bill

SHA256は引き続きNIST承認済みですが、可能であればSHA512またはbcryptに変更することをお勧めします。

執筆時点でのNIST承認済みハッシュ関数のリストは、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256、およびSHA3-です。 224、SHA3-256、SHA3-384、SHA3-512、SHAKE128およびSHAKE256。

https://csrc.nist.gov/projects/hash-functions を参照してください

実行しているオペレーティングシステムによっては、SHA3またはSHAKEハッシュ関数にアクセスできない可能性があります。

多くの人はSHA512よりもbcryptを好んでいますが、bcryptは一部のオペレーティングシステムでのみ利用可能です。

SHA512はシステム上で利用可能になります。利用できない場合は、おそらく古いシステムを使用しているため、ハッシュアルゴリズムを選択するのが最も問題になりません。

一般的にbcryptを好む理由の1つは、bcryptが調整可能であることです。ラウンド(ワークファクター)の数を増やして、bcryptハッシュのクラッキングにかかる​​時間を増やすことができます。

ただし、SHA256とSHA512も調整可能です。デフォルトは5000ラウンドですが、必要に応じてさらに指定できます。 500000は現在のPCの計算に約0.45秒かかりますが、これは許容範囲内です。

例えば。:

password    required    pam_unix.so sha512 shadow rounds=500000 ...

SHA256をSHA512に変更する理由は、SHA256がSHA512と同じくらい安全であるためにより多くのラウンドが必要であるため、安全ではありませんが、安全性が低いからです。

例: https://medium.com/@davidtstrauss/stop-using-sha-256-6adbb55c608

暗号は急速に変化するため、明日の答えは明日間違っている可能性がありますが、現状の技術では、bcryptはSHA512よりも優れている可能性がありますが、SHA512は問題ありません。

SHA512が「箱から出してすぐに」入手できるものである場合は、SHA256ではなくそれを使用します。また、ディストリビューションの標準になるまで、bcryptまたはSHA3ファミリーについて心配する必要はありません。


余談ですが、現在の最高評価の回答には、間違っているか誤解を招くような主張が多数あります。

「SHA512に切り替えても、Webサイトの安全性はほとんど向上しません。」

これは誤解を招きます。 SHA512に切り替えると、サイトのセキュリティがわずかに向上します。 SHA256はSHA512ほど優れていませんが、恐ろしいことでもありません。システムでまだ利用可能なSHA512より明らかに優れているものはありません。 Bcryptはより良いかもしれませんが、これは明確ではなく、bcryptは多くのシステムで利用できません。 SHA3​​ファミリはおそらく優れていますが、広く利用されているわけでもありません。

「SHA256とSHA512は決してパスワードハッシュすることを意図していませんでした」

これは間違っています。 SHA256とSHA512はどちらも承認済みのNISTハッシュアルゴリズムです。

「辞書攻撃を防ぐために、パスワードハッシュスキームには、実行可能な限り遅くするための作業要素を含める必要があります。」

これは間違っています。高い作業係数は、ブルートフォースハッシュクラッキングから保護しますが、辞書攻撃からは保護しません。使用できるほど低くはありませんが、辞書攻撃から保護するほど高い作業要素はありません。パスワードが辞書のWordである場合、辞書攻撃に陥ります。辞書にあるパスワードを使用しない辞書攻撃に対する保護。

私の現在のPCでは、ラウンドの制限は1000万回と思われ、入力されたパスワードごとに8.74秒の遅延が生じます。それはあなたが使いたいと思うよりも長く、非常に痛みを伴うのに十分な長さです。ブルートフォース攻撃を防ぐのに十分な長さですが、良いクラッキングリグと少しの忍耐力を備えた断固とした敵は、必要に応じて辞書を反復処理できます。

「パスワードハッシュ機能は... Rainbowテーブルに対して防御する必要があります」

これは、せいぜい誤解を招くだけです。レインボーテーブルに対する防御は、各パスワードに独自の「塩」を持たせることです。これは最近の標準的な方法であり、ハッシュ関数が呼び出される前に発生します。 (ソルトとは、ハッシュする前にパスワードにランダムな文字列を追加することを意味します。ソルトはパスワードとともに保存されるため、秘密ではありませんが、ユーザーがよく知られているパスワードを選択しても、攻撃者は単に{このハッシュ}が{そのパスワード}に属していることを認識しても、ハッシュを解読する必要があります。)

「現在、おそらく最良の選択はArgon2です。このパスワードハッシュ関数ファミリは、2015年のパスワードハッシュコンペティションで優勝しました。」

これは不明です。 「新しい」暗号化機能は、明らかな方法で破られる可能性があるため、ほとんどの人は広く使用されている機能を好むのです。それに加えて、Argon2はおそらく利用できません。

「標準を使用する必要がない場合のその他の選択肢には、bcryptとscryptが含まれます。」

これは不明です。ある時点で、scryptはより優れたbcryptと見なされていました。ただし、さまざまな理由により、センチメントはscryptからbcryptに移行しています。例: https://blog.ircmaxell.com/2014/03/why-i-dont-recommend-scrypt.html

繰り返しますが、この時点では、SHA512が適切な選択であるように思われ、bcryptも同様です。

SHA512はNISTで承認されていますが、bcryptは承認されていません。

SHA512は、ほぼ確実にシステムで使用できます。 Bcryptはそうである場合とそうでない場合があります。

両方がシステム上にある場合、bcryptをお勧めしますが、それは近い呼び出しです。どちらでも構いません。

0
Ben Aveling