Text

BCrypt Validation

Validate the hash is calculated from the text.


Hash
Text

Success

Failure


Tips

  • BCrypt はソルトを内包するため、ハッシュ値が毎回異なっても同じ元文字列から生成されていれば一致と判定されます。
  • PHP の password_verify($password, $hash) と同じ仕組みで検証しています。
  • データベースから取得したハッシュ値と入力パスワードを照合する際は、通常の文字列比較(==)ではなく専用の検証関数を使ってタイミング攻撃を防いでください。
  • ハッシュ値が $2a$ から始まる場合も BCrypt として検証できます。

余談ですが ― 認証の裏側 ― ログインの「あの0.数秒」の正体

Webサービスでログインボタンを押してから結果が返ってくるまでの 0.数秒。実はこの時間の一部は、BCryptがパスワードのハッシュ計算をしている時間です。セキュリティのために「わざと」時間をかけているのです。

タイミング攻撃(Timing Attack) とは、処理時間の微妙な差を計測することで秘密情報を推測するサイドチャネル攻撃の一種です。通常の文字列比較(==)でパスワードを検証すると、文字が合致した位置によって比較時間がわずかに変わります。BCryptの検証関数は定数時間で動作するよう設計されており、この攻撃に対して安全です。

実際のWebアプリでは、ユーザーが存在しない場合でも「存在するが、パスワードが間違っている」と同じ程度の時間をかけてレスポンスを返すことが推奨されています。「ユーザーが存在しません」と「パスワードが間違っています」を区別できると、攻撃者にとって有効なユーザー名を特定するヒントになってしまうからです。