パスワードを安全にハッシュする方法は? または bcryptやscryptよりも最新のパスワードハッシュ方法はありますか? を含む、ハッシュ関数の選択に関する多くの質問があり、非常に詳細な回答があります。しかし、それらのうちのかなりのものはかなり日付が長い。
コンセンサスは以下のようでした:
現在、Argon2はパスワードハッシュコンペティションの優勝者ですが、それはまだまったく新しいものであるため、当時scryptに適用されていたものと同じ議論がおそらく今も当てはまります。
質問:
基本的に、今日、パスワードを使用する平均的なシステムの場合、どのパスワードハッシュ関数を使用すればよいですか。パラメータを持つ関数の場合、それらはどうあるべきですか?
上記のように、質問は パスワードを安全にハッシュする方法 とほぼ同じですが、その質問に対するほとんどの回答は2010-2013にさかのぼります。 2016年以降の最新の関連更新。それ以来、物事は明らかに変わっており、私が探しているのは、これらの優れた答えの更新です。その質問の更新を自由に回答し、より理にかなっていると思われる場合はこの質問を閉じてください。ただし、ここまたはそこに最新の回答がない限り、この質問を閉じないでください。
入力値が人間が生成したトークン(パスワードなど)であり、オフラインのクラッキングが脅威モデルに含まれている新しい設計では、bcryptはお勧めしません。最近のハードウェアがどれだけ強力であるかを考えると、メモリの不足は深刻な問題です。主要なbcryptベースの暗号通貨の欠如は、FPGAまたはASIC=アルゴリズムのマイニング実装を引き付けていませんが、ハイブリッドARM/FPGA SoCを使用してbcryptを攻撃することにまだ関心があります。 2014年のこの論文 。最終的に、メモリの硬度の欠如は、現代の設計にとって大きな問題です。
scryptは、その設計の一部としてメモリの硬度を持っていますが、いくつかの欠点があります。はじめに、暗号ベースの暗号通貨はかなり多く、これにより、商品FPGAおよびASICクラッキングに再利用できるマイニングソリューションの市場がかなり集まりました。さらに、scryptのメモリ硬度と反復回数は両方とも単一のスカラーコスト係数に関連付けられています。これにより、独自の脅威モデルに合わせてscryptを調整することが難しくなります。たとえば、これは、ユーザーパスワードを保護するための組み込みオプションです。
最終的に、いくつかの理由から、私は常にArgon2を推奨する選択肢としてお勧めします。
ご指摘のとおり、選択するパラメーターは重要です。 scryptは多くの選択肢を与えないので、その場合は時間(たとえば、1500msの処理)に基づいてコスト係数を選択することをお勧めします。
Argon2には、パラメーター以外にも多くの選択肢があります。実際には、Argon2d、Argon2i、およびArgon2idと呼ばれるArgon2の3つの異なる実装があります。最初のArgon2dは最も計算コストが高く、メモリ帯域幅が限られているGPU、FPGA、およびASICによる加速に耐性があります。ただし、Argon2dのメモリアクセスはパスワードに依存しているため、メモリアクセスに関する情報をリークするサイドチャネル攻撃により、パスワードが明らかになる可能性があります。 Argon2iは、そのサフィックスが示すように、パスワードとは無関係にメモリアドレスを選択します。これにより、GPUクラッキングに対する耐性が低下しますが、サイドチャネル攻撃は排除されます。 Argon2idはハイブリッドアプローチであり、最初のパスはArgon2i(独立)アプローチを使用し、後続のパスはArgon2d(独立)アプローチを使用します。
可能な限り、Argon2id実装を使用する必要があります。ただし、これは常に利用できるわけではありません。サーバーのパスワードを保護していて、脅威モデルがメモリアクセスサイドチャネル攻撃を行う可能性が非常に低いと見なしている場合(これはほとんどの場合私の経験です)、Argon2dを使用できます。メモリアクセスのサイドチャネル攻撃が潜在的なリスクであると見なされる場合。信頼されていないユーザーまたは信頼されていないユーザーがArgon2ハッシュを実行するのと同じシステムでコードを実行するマルチテナントシステムでは、Argon2iの方が適している場合があります。
要するに、可能であればArgon2idを使用し、他のほとんどすべての場合にArgon2dを使用します。メモリのサイドチャネル攻撃に対する耐性が本当に必要な場合は、Argon2iを検討してください。
パラメータについては、唯一のハードルールはArgon2iに対するものです。Argon2iは、他のオプションと比較して弱いため、特別に扱う必要があります。特に、反復数は Argon2iに対する実際的なトレードオフ攻撃 のため、10以上でなければなりません。
独自のユースケースとパフォーマンスの要件に合わせてパラメーターを微調整する必要がありますが、Argon2idとArgon2dのデフォルトは次のように許容できると思います。
これの速度はプロセッサによって異なりますが、私のシステムでは約2000msを達成しました。
Argon2iの場合、反復回数を最低10に増やす必要があります。その場合、パフォーマンス上の理由からメモリ係数を減らす必要があります。これは、メモリアクセスサイドチャネルへの抵抗を絶対に必要としない限り、Argon2iを回避しようとするもう1つの理由です。