すべての記事

Bcrypt:パスワードが速くではなく遅くハッシュ化される理由

bcryptの72バイト制限は言語によって効き方が大きく異なります。日本語のひらがな・カタカナ・漢字はUTF-8で1文字あたり3バイトを使うため、日本語パスワードの実質的な上限は72文字ではなく約24文字になります。たとえば「とても安全なパスワードです」のような24文字前後の日本語パスフレーズは、すでにこの境界に達しているということです。

速度がパスワードのセキュリティを損なう理由

攻撃者がパスワードハッシュのデータベースを盗んだ場合、総当たりで元のパスワードを復元しようとします。SHA-256のような高速な関数では、現代のハードウェアは1秒間に数十億の組み合わせをチェックできます。bcryptは1回のハッシュ化に意図的に約100ミリ秒かけるため、総当たり攻撃は桁違いに遅く、コストのかかるものになります。

cost factorとは何か

bcryptの「cost」パラメータは内部ラウンド数を2のべき乗(2^cost、通常10〜12)として指定します。1つ上げるごとにハッシュ化にかかる時間はおよそ2倍になり、攻撃者側の総当たりコストも同様に2倍になります。

組み込みのソルト

bcryptは各パスワードに対して一意のランダムなソルトを自動生成し、結果に直接埋め込みます——別途保存する必要はありません。同一のパスワードでも異なるハッシュが生成され、よくあるパスワード向けに事前計算されたハッシュテーブル(レインボーテーブル)は無意味になります。各ハッシュを個別に攻撃する必要があります。

なぜこれが必要か

  • アプリケーションのデータベースにユーザーパスワードを正しく保存する。
  • SHA-256やMD5がパスワードのハッシュ化に適さない理由を理解する。
  • bcryptを使用する認証システムをテストまたは移行する。

24文字、72文字ではない

バイト数の上限はどの言語でも同じく72バイトですが、そこに収まる文字数は文字体系によって変わります。ラテン文字なら72文字、日本語のようにUTF-8で1文字3バイトを使う言語ではその3分の1にとどまります。日本語ユーザー向けのサインアップフォームでパスワードの最大長を設計する際は、この違いを踏まえておく価値があります。

ツールを試す