【びーくりぷと】

bcrypt とは?

最終更新:
💡 パスワードを「わざと遅く」ハッシュする

パスワードの保存に使うハッシュ関数。ソルトと調整可能な計算コストを使い、漏えいしたハッシュからパスワードを推測する試行を重くする。

📌 このページのポイント
パスワードをハッシュ化して保存登録する入力パスワードソルトコスト値bcrypt保存用文字列方式・コストソルトハッシュ値平文のパスワードを保存する図ではない照合:入力と保存済みの設定で確かめる
登録時の流れ。ランダムなソルトとコストを使い、方式・コスト・ソルト・ハッシュ値を含む文字列を保存します。照合は専用APIで行い、保存値を復号する操作ではありません。
ひよこ ひよこ
なぜSHA-256をそのまま使わないの?
ペンギン先生 ペンギン先生
SHA-256のような高速な汎用ハッシュだけでは、漏えい後に大量の候補を試されやすいよ。bcryptは1回の計算を重くして試行の負担を増やす。ただし短いパスワードなどは推測され得るので、「破るまで必ず数千年」という保証にはならないんだ
ひよこ ひよこ
同じパスワードなら、同じ保存値になる?
ペンギン先生 ペンギン先生
ランダムなソルトが異なれば、同じパスワードでも保存値は変わるよ。bcryptの保存用文字列には方式・コスト・ソルト・ハッシュ値が含まれる。多くのライブラリはソルトの生成も扱うけれど、どのAPIが担当するかは使うライブラリで確認しよう
ひよこ ひよこ
コストはどう設定するの?
ペンギン先生 ペンギン先生
コスト値は計算回数の指数で、10なら2の10乗、12なら2の12乗に対応するよ。実際の認証サーバーで処理時間と同時アクセス時の負荷を測って決める。OWASPはbcryptを使う場合の最低コストを10としているけれど、全環境で12〜14が最適と決まっているわけではないんだ
ひよこ ひよこ
実装時には何に注意する?
ペンギン先生 ペンギン先生
多くの実装で入力の上限は72バイトで、72文字ではないよ。上限超過を切り詰めるか拒否するかなど、ライブラリの仕様を確認しよう。単純にSHA-256を前置きすれば安全とは言えない。照合にはライブラリの専用APIを使い、保存済みのコストやソルトで入力を確かめるんだ
ひよこ ひよこ
新しく作るシステムでもbcryptを選ぶ?
ペンギン先生 ペンギン先生
OWASPは新規のパスワード保存にArgon2idを推奨し、bcryptはArgon2やscryptを利用できない既存システム向けとしているよ。Argon2idはメモリの使用量も調整する設計。bcryptもコストを見直せるけれど、入力長や運用環境を含めて方式を選ぶことが大切なんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「bcrypt」って出てきたら「推測の試行を重くする、パスワード保存用のハッシュ関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「bcrypt」 = Blowfishを基にしたパスワード用のcrypt
💬 OpenBSDの資料ではBlowfishを基にしたパスワードハッシュとして説明されているよ。保存値を復号して元のパスワードへ戻す暗号化とは違うんだ

参考資料

← 用語集にもどる