【あるごんつー】

Argon2 とは?

💡 パスワードハッシュの「現在の最適解」
📌 このページのポイント
Argon2 vs bcrypt — メモリ硬度の違い Argon2(推奨) パスワード + Salt Argon2 CPU時間 メモリ消費 ↑ 両方を大量に要求 ハッシュ値 bcrypt(従来) パスワード + Salt bcrypt CPU時間のみ ハッシュ値 Argon2はメモリも大量に使うため、GPU並列攻撃に強い
Argon2のイメージ — メモリ硬度でブルートフォースに対抗
ひよこ ひよこ

bcryptとどう違うの?

ペンギン先生 ペンギン先生

bcryptCPU時間を消費して攻撃を遅くする。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$ソルト$ハッシュ で、パラメータソルトハッシュ値に含まれるから別途保存する必要がないよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Argon2」って出てきたら「パスワードハッシュの最新推奨アルゴリズム」と思えればだいたいOK!
📖 おまけ:英語の意味
「Argon2」 = アルゴン2
💬 希ガスのArgon(アルゴン)に由来。化学元素から名前を取るのはハッシュアルゴリズムの伝統だよ
← 用語集にもどる