bcryptとどう違うの?
bcryptはCPU時間を消費して攻撃を遅くする。Argon2はCPU時間に加えてメモリも大量に消費する。GPUは計算は得意だけどメモリが限られているから、メモリを大量に要求するArgon2はGPUでの並列攻撃に特に強い。bcryptの72バイト制限もArgon2にはない。新規プロジェクトならArgon2idを選ぼう
3種類あるけどどれを使う?
Argon2id一択。Argon2dはGPU攻撃に強いけどサイドチャネル攻撃に弱い。Argon2iはサイドチャネル攻撃に強いけどGPU攻撃耐性が低い。Argon2idは前半をArgon2iモードで(サイドチャネル対策)、後半をArgon2dモードで(GPU対策)実行するハイブリッド。OWASPもArgon2idを推奨しているよ
パラメータはどう設定する?
3つのパラメータを設定する。①メモリ(推奨: 64MB以上)、②反復回数(推奨: 3回以上)、③並列度(推奨: CPUコア数)。OWASP推奨のミニマム設定はArgon2id、メモリ19MiB、反復2回、並列度1。サーバーのスペックに合わせて「ハッシュ計算に200ms〜500msかかる」設定を見つけるのが目安だよ
実装方法は?
各言語にライブラリがある。Node.jsならargon2パッケージ、Pythonならargon2-cffi、Goならgolang.org/x/crypto/argon2、PHPは7.2からpassword_hash()でArgon2idをネイティブサポート。出力形式は$argon2id$v=19$m=65536,t=3,p=4$ソルト$ハッシュ で、パラメータとソルトがハッシュ値に含まれるから別途保存する必要がないよ