私はこれを発見しました presentation Facebookが顧客のパスワードをどのように保存し、どのように認証を行うか。
このスライドは、パスワードをハッシュする方法を示しています。
生のパスワードを使用してこのような操作を行うことは良い考えですか? 「あいまいさによるセキュリティ」ではないでしょうか。このような操作をPBKDF2
を使用して行うのは理にかなっていますか?
あなたが書いたコメントの一つで:
2018年に、このようなことが理にかなっているかどうかを尋ねています。8バイトのソルトでPBKDF2 HMAC-SHA-256を使用し、ハッシュスキーマの使用方法について説明します。
その答えはノーです。 FaceBookソリューションから複製する必要がある唯一の部分は、メモリハード機能と暗号化サービスペパーリングを使用することです。 MD5
およびHMAC
パーツはセキュリティを向上させません。 (ただし、それらはかなり無害です。)
PBKDF2は使用しないでください。あなたが好むはずですために:
FaceBookメソッドが無名によるセキュリティかどうかも。いいえ。しかし、HMACパーツとおそらくMD5パーツは冗長です。 cryptoservice
パーツはおそらくHSMを使用しています。 これにより、パスワードハッシュデータベースを盗むタイプのハッカーに暗号化キーを公開することなく、パスワードハッシュを暗号化/復号化できるようになります。 秘密鍵で主流の暗号化アルゴリズムを使用することは、不明瞭とは見なされません。キーが漏洩した場合に備えて、パスワードをハッシュ化する必要があります。それがscryptの目的ですが、今はArgon2が推奨されます。
編集:コメントを参照してください。スライドに示すように、パスワードは暗号化されません。 HMACは、ハッシュと同様に1つの方法です。ハッシュ後の暗号化の代替手段は、キーを置き換えることができるため便利です。このFaceBookセットアップでキーを変更する場合、saltまたはscryptパラメータに加えて、ユーザーはパスワードを入力する必要があります。ハッシュを暗号化すると、ユーザーがパスワードを入力しなくても、ハッシュを復号化して再暗号化できます。 (キーが漏えいした場合...しかし、元のキーがないとパスワードを再ハッシュすることはできません。)
また、20バイトのソルトを使用します。または少なくとも16。
この「タマネギ」構造は危険な場合があり、十分なレビュアーがいる場合にのみ実行する必要がありますが、単純なハッシュと比較して複数の好ましいプロパティが追加されます。
最初の無塩MD5は、クライアントまたはフロントエンドサーバーで実行できます。文字セットと長さを正規化し、CPUに負荷をかけすぎずに初期の段階でパスワードを難読化します。
ソルトはユーザーデータベースから読み取られるため、クライアントには存在しません。これが最初のHMAC追加です。
暗号化サービス(またはより優れたHSM)は、ブルートフォースから保護します(秘密鍵が不明であるため)。実際、これは、これを正確に行うためのNIST推奨よりも古いものです。複雑なシステムセットアップ(HSMまたはプロセスの分離)を必要とするため、このペパリングはあまり行われません。
ペッパーステップは内部関係者によって危険にさらされる可能性があるため、データはscryptに渡されます。これは、パスワードのブルートフォーステストをより高価にするために設計された機能です。
最後のステップは必要ないかもしれません、または多分それはいくつかの多様化を追加するために使用されます(SHA1の代わりにSHA2)。
ヘビオイルのやり過ぎに少し似ていますが、手順は合理的に説明できます。 (はるかに弱い)glibc-SHA2 Voodooと比較すると、本当にきれいです。
ところで、覚えやすいオーセンティケーターは一般的に悪いことです。そのようなスキームはそれらを処理するリスクを減らすことができるだけです。
BTW2:SHA1の衝突の弱点はHMACコンストラクトには適用されず、短いMD5ハッシュサイズはここではあまり問題になりません(パスワードのエントロピーはほとんど常に低いため)。鍵の導出にはリスクが高くなりますが、それは現在の課題ではありません。