web-dev-qa-db-ja.com

2018年に、パスワードを保存するために推奨されるハッシュは何ですか:bcrypt、scrypt、Argon2?

パスワードを安全にハッシュする方法は? または bcryptやscryptよりも最新のパスワードハッシュ方法はありますか? を含む、ハッシュ関数の選択に関する多くの質問があり、非常に詳細な回答があります。しかし、それらのうちのかなりのものはかなり日付が長い

コンセンサスは以下のようでした:

  • bcryptは良い選択です
  • scryptの方が良い選択ですが、当時はまだ少し新しいので、時間の試練に耐えられるかどうかを確認する必要があります。

現在、Argon2はパスワードハッシュコンペティションの優勝者ですが、それはまだまったく新しいものであるため、当時scryptに適用されていたものと同じ議論がおそらく今も当てはまります。

質問:

  • Bcryptはまだ良い選択ですか?
  • Scryptは良い選択ですか?
  • Argon2はすでに良い選択ですか?

基本的に、今日、パスワードを使用する平均的なシステムの場合、どのパスワードハッシュ関数を使用すればよいですか。パラメータを持つ関数の場合、それらはどうあるべきですか?

編集する

上記のように、質問は パスワードを安全にハッシュする方法 とほぼ同じですが、その質問に対するほとんどの回答は2010-2013にさかのぼります。 2016年以降の最新の関連更新。それ以来、物事は明らかに変わっており、私が探しているのは、これらの優れた答えの更新です。その質問の更新を自由に回答し、より理にかなっていると思われる場合はこの質問を閉じてください。ただし、ここまたはそこに最新の回答がない限り、この質問を閉じないでください。

60
jcaron

入力値が人間が生成したトークン(パスワードなど)であり、オフラインのクラッキングが脅威モデルに含まれている新しい設計では、bcryptはお勧めしません。最近のハードウェアがどれだけ強力であるかを考えると、メモリの不足は深刻な問題です。主要なbcryptベースの暗号通貨の欠如は、FPGAまたはASIC=アルゴリズムのマイニング実装を引き付けていませんが、ハイブリッドARM/FPGA SoCを使用してbcryptを攻撃することにまだ関心があります。 2014年のこの論文 。最終的に、メモリの硬度の欠如は、現代の設計にとって大きな問題です。

scryptは、その設計の一部としてメモリの硬度を持っていますが、いくつかの欠点があります。はじめに、暗号ベースの暗号通貨はかなり多く、これにより、商品FPGAおよびASICクラッキングに再利用できるマイニングソリューションの市場がかなり集まりました。さらに、scryptのメモリ硬度と反復回数は両方とも単一のスカラーコスト係数に関連付けられています。これにより、独自の脅威モデルに合わせてscryptを調整することが難しくなります。たとえば、これは、ユーザーパスワードを保護するための組み込みオプションです。

最終的に、いくつかの理由から、私は常にArgon2を推奨する選択肢としてお勧めします。

  1. 2015年に [〜#〜] phc [〜#〜] を獲得しました。Argon2のセキュリティ証明を研究する多くの論文があり、さらに多くの可能性を研究しています。専用ハードウェアでアルゴリズムを高速化する方法。これまでのところ、それは非常によく精査に耐えてきました。
  2. C、Erlang、Go、Haskell、JavaScript、Java、Lua、OCaml、Python、R、Ruby、Rust、C#(フレームワークとコアの両方)、Perl、および オープンソースの実装とバインディング があります。迅速。
  3. Argon2はAES暗号を中心に構築されており、最新のx86_64およびARMv8プロセッサのほとんどはAES命令セット拡張を実装しています。これにより、目的のシステムと専用のクラッキングシステムの間のパフォーマンスのギャップを埋めることができます。 (編集、2019年2月:Argon2の新しいバージョンは、ハードウェア拡張のAES実装と互換性がない可能性があります。これに関する議論についてはコメントを参照してください)
  4. Argon2は、メモリの3分の1を超えてランク付けされるトレードオフ攻撃に対して特に耐性があり、FPGAで安価に加速することをはるかに難しくしています。これは、FPGAベースのクラッキングソリューションの大部分がメモリ帯域幅によって制限されるためです。Argon2の設計では、攻撃者はメモリ帯域幅の要件を減らすために計算時間を大幅に増やし、トレードオフを非効率にする必要があります。この詳細については、 Argon2論文 のセクション5.1を参照してください。scryptに関する情報は、論文の表6(セクション5の下)で比較できます- "メモリーハード関数のトレードオフ暗号解析"
  5. メモリー硬度とCPU硬度のパラメーターは、並列処理係数と共に個別に構成できます。これにより、適度なCPUパワーと大量のRAMを搭載したサーバーなど、ユースケースに合わせたセキュリティをより適切に調整できます。

ご指摘のとおり、選択するパラメーターは重要です。 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のデフォルトは次のように許容できると思います。

  • 512MBのメモリ
  • 8反復
  • 並列処理係数8

これの速度はプロセッサによって異なりますが、私のシステムでは約2000msを達成しました。

Argon2iの場合、反復回数を最低10に増やす必要があります。その場合、パフォーマンス上の理由からメモリ係数を減らす必要があります。これは、メモリアクセスサイドチャネルへの抵抗を絶対に必要としない限り、Argon2iを回避しようとするもう1つの理由です。

53
Polynomial