2026/03/10
パスワードハッシュアルゴリズムとは
パスワードの保存には MD5 や SHA-256 などの汎用ハッシュ関数は使わず、パスワードハッシュ専用のアルゴリズムを使用する
各アルゴリズムの概要
bcrypt
Blowfish 暗号を基盤とし、ソルト保護機能を内蔵したパスワードハッシュ関数(歴史が長い)
| 項目 | 内容 |
|---|---|
| 登場年 | 1999年 |
| 特徴 | 実績が豊富(枯れた技術) |
// PHP での使用例
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$valid = password_verify($password, $hash);
scrypt
ハードウェアによる総当り攻撃に対して最大限の安全性を確保するメモリハードアルゴリズムとして設計
| 項目 | 内容 |
|---|---|
| 登場年 | 2009年 |
| 特徴 | メモリハード設計 |
// PHP での使用例(openssl_pbkdf2 または sodium 経由)
$hash = sodium_crypto_pwhash_str(
$password,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
Argon2
Argon2id という主要なバリアントと、Argon2d と Argon2i という2つの補助バリアントが存在
| バリアント | 特徴 | 用途 |
|---|---|---|
| Argon2d | データ依存型メモリアクセス、GPUなどの並列ハードウェア攻撃に対して高い耐性を持つ | サイドチャネル攻撃の考慮が不要な環境 |
| Argon2i | データ独立型メモリアクセス、サイドチャネル攻撃に対して強い | パスワードハッシュ |
| Argon2id | Argon2i と Argon2d のハイブリッド | 汎用推奨 |
| 項目 | 内容 |
|---|---|
| 登場年 | 2015年 |
| 特徴 | メモリ・CPU・並列度を独立して調整可能 |
// PHP での使用例
$hash = password_hash($password, PASSWORD_ARGON2ID, [
'memory_cost' => 65536, // 64MB
'time_cost' => 4, // 反復回数
'threads' => 2, // 並列スレッド数
]);
$valid = password_verify($password, $hash);
参照
- https://www.tarsnap.com/scrypt.html
- https://datatracker.ietf.org/doc/html/rfc7914
- https://www.rfc-editor.org/rfc/rfc9106.html
- https://www.cryptolux.org/images/0/0d/Argon2.pdf
- https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
- https://www.php.net/manual/ja/function.password-hash.php
- https://www.php.net/manual/ja/function.password-verify.php
- https://www.php.net/manual/ja/function.sodium-crypto-pwhash-str.php
- https://stytch.com/blog/argon2-vs-bcrypt-vs-scrypt/