piapia123
ja

Bcrypt ハッシュの生成と検証

エンコード

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

bcrypt のパスワードハッシュを生成・検証します —— 今日パスワードを保存するならこれ(あるいは scrypt か Argon2)です。要点は「速く計算する」ことではなく、意図的に遅くすることです:コスト係数を1つ上げるごとに計算量が倍になり、攻撃者の総当たりコストも倍になりますが、正常なログインは数十ミリ秒しか待ちません。ハッシュ文字列にはアルゴリズム識別子・コスト係数・ソルトがすでに含まれているため、検証時に別途保存するものは何もありません —— そのままユーザーテーブルに保存してください。本ツールは `$2y$` プレフィックス(PHP の password_hash が使うもの)で出力し、検証時は `$2a$` と `$2b$` も受け付けます —— 標準入力では3者とも等価です。計算はすべてローカルで行われ、パスワードもハッシュも送信されません。

機能

  • 双方向:ハッシュの生成、パスワードとハッシュの照合
  • コスト係数は 4〜15 で調整可能。各段階のおおよその所要時間も表示します
  • `$2y$` プレフィックスで出力(PHP 互換)。検証時は `$2a$` / `$2b$` も受け付けます
  • ハッシュにソルトとパラメータが含まれるため、検証時に別途保存するものはありません
  • 毎回異なるソルトを使うので、同じパスワードでも毎回違うハッシュになります
  • 長さや形式が違う場合は、「検証失敗」ではなく具体的な理由を示します

使い方

  1. モードを選びます:生成または検証
  2. 生成時はコスト係数を設定し、検証時は既存のハッシュを該当欄に貼り付けます
  3. パスワードを入力欄に貼り付けます
  4. Ctrl/⌘ + Enter か「実行」を押し、結果をコピーします

よくある質問

コスト係数はいくつにすべきですか?
既定の 10(約 60 ミリ秒)でほとんどの用途に足ります。トレードオフは「サーバーが検証1回に待つ時間」と「攻撃者が1回の試行に計算する時間」で、これらは同じ数値です —— だから際限なく上げることはできません。12 はよく選ばれる値で、15 では検証1回が2秒近くになり、アクセスの多いサイトでは負荷が目に見えます。より強固な保護が必要なら scrypt か Argon2 に切り替えてください。同じ待ち時間でより多くのメモリを要求でき、メモリこそ攻撃者が最も増やしにくい資源です。
同じパスワードなのに毎回ハッシュが違うのはなぜですか?
毎回ランダムなソルトを生成し、ハッシュ文字列に埋め込むからです(`$2y$10$` の後ろの22文字)。これがレインボーテーブル対策の要点です:ソルトがなければ、攻撃者はよくあるパスワードのハッシュを事前計算した表を作り、一致するレコードをまとめて引けます。レコードごとにランダムなソルトがあれば、同じパスワードでも行ごとにハッシュが変わり、その表は無効になります。つまり毎回結果が違うのは正しい動作で、不具合ではありません。
検証が失敗したとき、パスワードの誤りかハッシュの形式不良かを見分けるには?
本ツールはこの2つを区別します。形式が不正な場合(`$2y$` がない、60文字でないなど)は「bcrypt ハッシュではない」と明示し、正しい形式を示します。形式が正しく単に一致しない場合は「不一致」と表示します。なお、データベースからハッシュをコピーすると空白や改行が付きがちですが、両端は自動的に除去されます。
bcrypt の限界は何ですか?
知っておくべき点が2つあります。第一に、72バイトで切り捨てられます —— それより長いパスワードの後半は無視されるため、「長いパスワードほど安全」は bcrypt では成り立ちません(本ツールはエラーにしませんが、知っておいてください)。第二に、CPU は消費しますがメモリは消費しないため、GPU による並列解読が比較的割に合います —— まさに scrypt と Argon2 が設計された理由です。一般的なウェブサイトなら bcrypt で十分ですが、より高い水準が求められる場面では Argon2id を使ってください。

関連ツール