web-dev-qa-db-ja.com

.NET Coreで最高のパスワードハッシュアルゴリズムはどれですか?

.NET Coreで最適なパスワードハッシュアルゴリズムを選択する際の考慮事項は何ですか?

私はすべてのハッシュアルゴリズムが準拠/未検証であるとは限らないので、NuGetからさまざまな実装を取得することをためらっています。また、いくつかのプロセス/お金が必要であることを確認するため、独自のハッシュアルゴリズムを作成することはお勧めしません。

現在、私は.NET Core Identity V3パスワードハッシュを使用しています。これは、少なくともMicrosoftが提供する公式のハッシュであるためです。

私は次のアルゴリズムが最良であると読みました:

  1. アルゴン2
  2. bcrypt
  3. 暗号
  4. カテナ
  5. PBKDF2(.NET Core Identity V3が使用するもの)

Argon2またはbcryptが理想的です。ただし、Googleが最初に見つけたものだけを使用したくありません。また、どのものが検証/推奨されているかを知るにはどうすればよいですか?

33
Water

Argon2は使用するのに最適です。十分に吟味されており、熱心な研究の対象となっています。パスワードハッシュコンテスト(PHC)の勝者として選ばれたscryptは、厄介な時間メモリトレードオフ(TMTO)攻撃があり、設定の柔軟性がそれほど高くありません。


Argon2 PHCを獲得し、トレードオフ攻撃の徹底的な分析に基づいています。実行するには構成可能なメモリ量が必要であり、攻撃者はその多くのメモリを使用する必要がありますブルートフォーススレッドごとを使用するか、大幅に多くの計算を実行する必要があります。メモリパスごとに、攻撃者がメモリ要件と時間要件を交換するために必要な柔軟性が低下します。 Argon2iとArgon2dと呼ばれる2つの主要なArgon2モードがあります。前者はサイドチャネル攻撃に対抗するように設計されていますが、後者はオフライン攻撃に対するセキュリティを最大化するように設計されています。最初のメモリパスにArgon2iを使用し、後続のパスにArgon2dを使用するハイブリッドのArgon2idも存在します。

bcryptは遅いBlowfishの主要なスケジュールから設計された古いKDFです。計算には4 KiBの高速メモリが必要であり、競合するメモリを使用するため、GPUベースのクラッカーでは非効率的です。これは、GPUには多数のコアがあるが、各コアはメインVRAMへのアクセスを共有する必要があるためです。 bcryptは実行時に4 KiBの状態を読み取り、変更するため、複数の並列GPUコアがメインメモリバスにアクセスできるユーザーをめぐって戦い、その結果、ほとんどのコアはアイドル状態になり、必要なメモリにアクセスできるようになるまで待機しますbcrypt評価を実行します。

scryptはメモリハードKDFですが、Argon2よりも深刻なTMTO攻撃の影響を受けます。つまり、攻撃者が十分なメモリを持っていない場合、より多くの操作を実行することにより、必要とされるよりも少ないメモリで同じ入力に対してscryptを実行できます。さらに、scryptの内部メモリと時間要件は独立していないため、処理時間を増加させずにメモリ使用量を増やすことは不可能であり、その逆も同様です。これは、各計算に数十ミリ秒しか費やしたくないが、数メガバイトのメモリを使用したいサーバーにとっては問題になるかもしれません。

CatenaはPHCの候補の1人でしたが、競争に勝ちませんでした。まだ読んでいないのであまり言えませんが、勝てなかったので、あまり研究が進んでいないので、何か問題があれば発見されないかもしれません。 。ただし、これは重要な研究の主題であり、確固たる理論的根拠があるため、悪いの選択ではありません。私はまだそれを使いません。

PBKDF2は最も古いKDFの1つであり、最も一般的です。それはメモリのハードではありません。つまり、攻撃者はメモリの問題に遭遇することなく、それに対して大量の並列攻撃を実行できます。 PBKDF2は、キー付きハッシュ(通常はHMAC)を取得して複数回実行することで機能し、各ハッシュ評価は以前のすべてのハッシュ評価に依存します。残念ながら、HMACで使用される一般的なハッシュでは、計算するメモリがほとんどないため、攻撃者はメモリハードKDFが引き起こす問題に遭遇することなく、GPUとASICのブルートフォース検索を大規模に並列化できます。

31
forest

Argon2はその中でも私の個人的なお気に入りですが、それらはすべて確かな選択肢であり、どちらかを選択するのに奇妙な見た目は得られないでしょう。最も重要なのは、適切なパラメーターを選択できるように、システムを適切にベンチマークすることです。

Argon2では、さらに操作モードを選択する必要があります。 Argon2i、Argon2d、Argon2idがあります。最初の2つのうちの1つを選択する十分な理由があることがわかっている場合を除き、Argon2idを選択する必要があります。

10
MechMK1

他の応答はリストから各アルゴリズムの有効性を議論していますが、.NET Coreの観点からの回答を試みます。最近変更がない限り、.NET Coreでネイティブにサポートされている(つまり、Microsoftが作成した)リストのアルゴリズムはPBKDF2のみです。一部の企業にとって、これはあなたの唯一の選択肢であることを意味します。サードパーティのNuGetパッケージを使用できるという贅沢がある場合は、リストにある他のアルゴリズムの多くの実装が多数見つかりますが、それらを信頼するかどうかを決定する必要があります。個人的には、ダウンロード数が少ないため、おそらく BCrypt-Official 以外を使用するのは不快ですが、それでも、さらに調査したいと思うかもしれません。誰でもNuGetパッケージを作成でき(必要に応じて「公式」と呼ぶ)、ほとんどのパッケージはレビュープロセスを通過する可能性が低いため、宿題はあなた次第であると考えることが重要です。

7
Paul Hiles