StackExchangeとHackerNewsがパスワードハッシュセキュリティの「peppers」のユーザーについて議論することをかなり読みました。 hash(password, pepper, salt)
のハードコード化されたソルトから各パスワードハッシュを個別に暗号化するまで、ペッパーのアイデアにはさまざまな実装があり、その場合、秘密キーはペッパーです。
中間的なアプローチの1つの場合、共有された秘密のペッパーがhash(hmac(password, pepper),salt)
を介して含まれます。これは主に、長さ拡張攻撃に対して脆弱であるマークル・ダムガード構造に多くのハッシュアルゴリズムが依存しているために必要です。
ただし、Argon2はMerkle–Damgård構造に基づいていないため、この攻撃は適用されません。 Argon2を使用する場合、argon2(password, pepper, salt)
の単純なアプローチを使用できますか?
さらに、Argon2仕様の概要では、HMAC、ペッパー、または秘密鍵を使用する必要がないことを示しているようです。強力なメモリ、スレッド、時間コストを備えたArgon2IDはそれ自体で十分ですか?
Argon2は実際にはペッパー アルゴリズム自体で を許可し、secret
と呼ばれます。これは、唐辛子を使用する理想的な方法です。残念ながら、私が調べたほとんどの言語バインディングは、このパラメーターを公開していません(GitHubにリストされている bindings のうち、そのうち2つだけが、キー付きハッシュのサポートについて具体的に言及しています)。 。
secret
パラメータを使用できない場合は、argon2(hmac(pepper, password))
が適切な代替手段です。 argon2
は、単純化のためにhmac
の外に適用できます。これは、一般的に使用される方法で、使用されるソルトとオプションのエンコーディングを含む出力を提供します。セキュリティのためにhmac
をargon2
外で使用することは同等ですが、Argon2パラメータを自分で追跡する必要があります。
コショウは必要ないことを示しているように見える仕様については、私はあなたがこれを参照していると仮定します:
パスワードハッシュの簡単な解決策は、HMACなどのキー付きハッシュ関数です。プロトコル設計者が秘密鍵なしのハッシュを好み、鍵の生成、保存、および更新に関するすべての問題を回避する場合、彼にはいくつかの代替手段があります:汎用モードPBKDF2、Blowfishベースのbcrypt、およびscrypt。
私がそれを読んだ方法、それが言っていることは、キーを保護する限り、キー付きハッシュは実際にはパスワードをハッシュするbest方法であるということですreally well(使用するなどHSM)。問題は、キーの保護が難しい(HSMは費用がかかる、HSMでペッパーをサポートするのに開発時間がかかる)ため、代わりにscrypt、bcrypt、Argon2などの遅いハッシュが使用されることです。
それがnotと言っているのは、キー付きハッシュを使用することですに加えて Argon2は悪い考えです。 HSMでキーを保護できない場合でも、パスワードハッシュよりも保護されていると価値があります。コストをどれだけ高く設定しても、最悪のパスワードは常に解読されます(ユーザーの忍耐力によって上限が低くなります)。コショウはそれを防ぐことができます。
編集:このコメント全体を取り消します。私のアプローチ自体は間違っていませんが、argon2は既にsecret
パラメーターを提供しています。これを使ってください。
これに対する最も単純なアプローチ、および最も強力な暗号基盤に基づくアプローチは、(単純に)HMAC(key, argon2(password))
です。これにより、サーバーリリーフの状況でクライアント側で高価なアルゴン2計算を実行することもできます。