bcrypt ハッシュ解析 — `$2a$10$...` の algorithm / cost / salt / hash を分解表示
bcrypt 形式のパスワードハッシュ (`$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy` など) を貼り付けると、algorithm version (`2a` / `2b` / `2y` / `2x`) ・cost (rounds 2^N) ・salt (base64 22 文字) ・hash (base64 31 文字) の 4 パートに分解して表示します。さらに **cost の指数的計算量** (cost=10 で 2^10 = 1024 回 Blowfish 拡張、cost=12 で 4 倍時間、cost=14 で 16 倍時間) と **2026 年の標準的なサーバーでの 1 ハッシュ所要時間目安** (cost=10 → ~100ms、cost=12 → ~400ms、cost=14 → ~1.6s) を表示するので、レガシーシステムの cost を上げるべきか判断材料に使えます。algorithm version の違い (`2a` = 1999 / `2x` = bug-compatible / `2y` = $2y$ patch / `2b` = OpenBSD 推奨) もカード形式で解説。データはサーバーに送信されません。文字列パースのみでハッシュ計算は行わないので、本ツール自体は元のパスワードを復元できません。
使い方
bcrypt 形式のハッシュ (`$2a$10$...` または `$2b$12$...` など、60 文字) を入力欄に貼り付け。 algorithm version / cost (rounds 2^N) / salt (22 文字) / hash (31 文字) の 4 パートに分解されて表示されます。 cost セクションには 2^N の値と、2026 年標準サーバーでの 1 ハッシュ所要時間目安が表示されます。 salt のみ (29 文字) を貼ると salt まで解析、hash 部は空のままになります。
詳細解説
bcrypt ハッシュ文字列に何が含まれているか
bcrypt ハッシュは $2b$12$EXRkfkdmXn2gzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg6Gm のような 60 文字の文字列です。これをパースすると、算法バージョン (2b)・cost ファクター (12)・salt (22 文字)・ハッシュ (31 文字) の 4 セクションに分解されます。ハッシュ自体はパスワードを「元に戻せない」一方向の変換ですが、この文字列全体には攻撃者にとって有用な情報が含まれています。salt と cost が判明すれば、オフラインのブルートフォース攻撃 (辞書攻撃やレインボーテーブル) の準備が整います。
データベースのダンプや設定ファイルから漏えいした bcrypt ハッシュを「どんな形式か確認したい」と思うのは自然なことですが、そのハッシュ文字列をオンラインサービスに送信することは、salt と cost を外部に公開することと同義です。本ツールはテキストのパースのみを行い、bcrypt の計算 (ハッシュの検証や生成) は一切しません。
bcrypt ハッシュをオンラインツールに貼る場面のリスク
「この bcrypt ハッシュの cost を調べたい」「バージョンが 2a か 2b か確認したい」という目的で検索すると、bcrypt パーサーやデコーダーを名乗るサービスが出てきます。そこにハッシュ文字列を貼った場合、送信された文字列はサーバーのアクセスログに記録されます。bcrypt ハッシュはパスワードそのものではありませんが、salt と cost の組み合わせがあれば総当たり攻撃の効率が大幅に向上します。
より深刻なのは、本来の目的が「特定のパスワードがこのハッシュと一致するか照合する」つまり検証 (verify) である場合に、平文パスワードとハッシュを両方オンラインサービスに送ってしまうパターンです。テスト用のハッシュ文字列でも、それが本番 DB 由来であればユーザーのパスワードを第三者に渡すことになります。
文字列パースのみ: ブラウザ内で完結する仕組み
本ツールは bcrypt ハッシュ文字列の構造をテキストパースするだけです。Blowfish 鍵スケジュールの計算は行いません。パースロジックは正規表現と文字列のスライシングのみで、外部ライブラリへの依存もなく、ネットワーク通信は発生しません。cost の実行時間目安は、2026 年標準サーバー (最近の M シリーズ Mac の単一コア性能を基準) でのおおよその値を静的に計算して表示しています。
入力されたハッシュ文字列はブラウザのページメモリにのみ存在し、DevTools の Network タブを開いた状態でハッシュを貼り付けても送信リクエストは一切発生しません。ページを離れれば入力内容は消去されます。
cost ファクターの確認を定期メンテナンスに
bcrypt のセキュリティ強度はハードウェアの進化に伴って低下します。cost = 10 は 2011 年頃の推奨値でしたが、2026 年時点では攻撃者側 GPU の計算速度が大幅に向上しており、OWASP は新規実装では cost ≥ 12 を推奨しています。自社システムの bcrypt ハッシュがどの cost で保存されているかを本ツールで確認し、cost の引き上げが必要かどうかを定期的にチェックする使い方が効果的です。既存ユーザーのハッシュは次回ログイン時に再ハッシュするパターンが一般的です。
Modified Blowfish と EksBlowfishSetup — bcrypt の内部構造
bcrypt は 1999 年に Niels Provos と David Mazières が USENIX で発表したアルゴリズムで、Blowfish 暗号の鍵スケジューリングを意図的に重くした「Eks (Expensive key schedule) Blowfish」を中核に据えています。標準の Blowfish が鍵から P-array と 4 つの S-box を 1 回だけ初期化するのに対し、EksBlowfishSetup は salt とパスワードを交互に使って 2^cost + 1 回もこの初期化を繰り返します。cost を 1 増やすと初期化回数が倍になり、計算時間も倍になる — これが「コストパラメータが指数的に効く」と説明される根拠です。
最終ステップでは初期化済みの Blowfish で固定の文字列 OrpheanBeholderScryDoubler (24 バイト) を 64 回 ECB モードで暗号化し、その結果が 23 バイトの hash として base64 エンコードされます。base64 のアルファベットも通常の RFC 4648 ではなく ./A-Za-z0-9 という bcrypt 専用のもので、+ / を . / に置換した独自仕様です。本ツールはこの hash 部分を 31 文字として表示しますが、その base64 を逆変換すると 24 バイトの末尾 1 バイト (パディング) を含まない 23 バイトの raw output が得られます。
2a 2b 2x 2y のバージョン分岐と相互運用上の罠
bcrypt のバージョン文字列 2, 2a, 2b, 2x, 2y は単なる識別子ではなく、特定の実装バグや仕様修正の歴史を反映しています。2 (1999) はオリジナル、2a (2011) は文字列終端の扱いを明確化したもの、2x は PHP 5.3.7 の crypt_blowfish バグ互換 (8 ビット目を符号付きで扱ってしまう問題)、2y はその bug fix 版、2b (2014) は 255 文字を超えるパスワードを正しく扱う OpenBSD 実装の修正版です。2x のハッシュは「同じパスワードでも文字コードが 0x80 以上の文字を含むと別ハッシュになる」ため、レガシーシステムからの移行で意図しない認証失敗を起こします。
bcrypt の入力長は内部的に 72 バイトで切り詰められる、というあまり知られていない制約があります。これは Blowfish の鍵長上限が 448 ビット (= 56 バイト) ですが、bcrypt は周回シフトで 72 バイトまで受け入れる設計のためです。72 バイト超のパスワードは 73 バイト目以降が完全に無視され、password123...(73 バイト目以降の任意文字列) が同じハッシュになります。パスフレーズ系のアプリケーションで「同じ最初の 72 文字が一致すれば認証通過」というセキュリティホールを作るので、長い入力を扱う場合は SHA-256 などで前処理して 32-64 バイトに正規化してから bcrypt に渡すのが定石です。前処理用の SHA-256 / SHA-512 は hash-generate でブラウザ内のまま算出でき、移行候補としてユーザーに新しいパスワードを促す場合は password-strength-check で bcrypt 投入前に強度を確認してから登録するワークフローに繋げられます。
よくある質問
- bcrypt のハッシュフォーマットは?
- `$<algorithm>$<cost>$<22-char salt><31-char hash>` の 4 セクション、合計 60 文字 (algorithm が 2 文字、cost が 2 文字、salt が 22 文字、hash が 31 文字、`$` 区切り 3 つ)。例: `$2b$12$EXRkfkdmXn2gzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg6Gm`。
- algorithm version の `2a` / `2b` / `2x` / `2y` の違いは?
- `2a` は 1999 年の元仕様で、いまも widely interoperable。`2b` は 2014 年に OpenBSD で修正された正式版で、新規実装ではこれを使うべき。`2x` は PHP `crypt_blowfish` のバグを互換維持するためのマーカー。`2y` は PHP がバグ修正された後の派生で、`2b` とほぼ等価。
- cost (work factor) は何を意味する?
- Blowfish key-schedule を 2^cost 回繰り返します。cost = 10 → 1024 回、cost = 12 → 4096 回、cost = 14 → 16384 回。`cost + 1` で計算量が 2 倍になる指数増加。本ツールには 2026 年標準サーバーでの目安時間 (cost=10 → ~100ms、cost=12 → ~400ms、cost=14 → ~1.6s) を表示しています。
- 推奨 cost は?
- 2026 年時点では cost = 12 が一般的な推奨値 (~400 ms / hash)。レイテンシ厳しい用途は cost = 10、より高セキュリティを求めるなら cost = 13 〜 14。GPU / FPGA 攻撃を考慮すると 1 ハッシュ ≥ 250 ms を目安に。OWASP は cost ≥ 10、Argon2id への移行推奨と同時に bcrypt なら cost ≥ 12 を推奨。
- 本ツールで元のパスワードは復元できる?
- いいえ。本ツールは **文字列パースのみ** で、bcrypt の Blowfish 計算は行いません。bcrypt は意図的に一方向 (irreversible) ハッシュなので、元のパスワードを得るには総当たり攻撃 (brute force) が必要で、本ツールには含まれていません。salt とハッシュからオフライン辞書攻撃を試みるのは可能ですが、それは別ツールの責務。
- bcrypt と Argon2 / scrypt / PBKDF2 の関係は?
- bcrypt (1999) は古典的選択肢で実装が広く、cost で計算量調整。Argon2id (2015 PHC winner) は memory-hard で 2026 年現在の OWASP 推奨。scrypt は Argon2 の前身で同じく memory-hard。PBKDF2 は computation-only で簡易だが GPU 攻撃に弱め。新規システムは Argon2id、既存システムの bcrypt は cost を引き上げて運用 ── が定番。
- salt の長さが 22 文字なのは?
- salt 16 バイトを bcrypt 独自 base64 (`./A-Za-z0-9` 64 文字) でエンコードしたものが 22 文字。標準 base64 とは異なるアルファベットを使うので注意 (`+/` の代わりに `./`)。
- データはサーバーに送信されますか?
- いいえ。文字列パースのみで Web API は使いません。
「送らない」を確かめるには
このツールは入力データを外部に送信しません。仕組み・監査手順・運営方針は以下で詳しく説明しています。
類似のツール
ハッシュ生成 — SHA-1 / 256 / 384 / 512
テキストから SHA-1 / SHA-256 / SHA-384 / SHA-512 のハッシュ値を一括生成します。Web Crypto API ベースでブラウザ内処理。
JWT デコード — header / payload を可読化
JWT を貼り付けて Header / Payload / Signature に分解。exp / iat / nbf などの数値クレームは人間可読な日時に変換して表示。署名検証は行いません (内容確認専用)。すべてブラウザ内で処理。
パスワード強度チェック (zxcvbn によるスコア / 推測時間 / 改善案)
Dropbox 由来の `zxcvbn-ts` (MIT) をブラウザ内で実行し、パスワードの推測難易度を 0〜4 のスコア / エントロピー (log2 換算) / 推測回数 / 4 種類の攻撃シナリオでの推定突破時間 / 検出された弱点パターン (辞書 / 連続 / 反復 / 日付 / 鍵盤シーケンス / leet 変形) を表示します。改善案は『大文字を混ぜる』『よく使われる単語を避ける』などフィードバック形式で日英対応。表示と切替で入力フィールドはマスク表示 (目アイコンでトグル) +『紛らわしい文字 (i/l/1/L/o/0/O) を強調表示』オプション。入力したパスワードはブラウザ内処理のみ、ネットワークに送信しません。
CRC 計算 — CRC-8 / CRC-16 / CRC-32 / CRC-32C を一括算出
文字列または HEX バイト列を入れて、CRC-8 / CRC-16 (CCITT-FALSE) / CRC-16 (Modbus) / CRC-32 (ISO-HDLC, ZIP/Ethernet) / CRC-32C (Castagnoli, SCTP/iSCSI) を **同時に** 算出します。CRC はデータの誤り検出 (バイナリプロトコル、ZIP/PNG/gzip のフレーム末尾、Modbus 産業機器通信、SCTP/iSCSI など) に使われる軽量チェックサム。ハッシュ生成 (SHA-256 等) と違って暗号用途ではなく、軽量で計算が高速、固定長 (8/16/32 bit) な点が特徴。入力は UTF-8 文字列か `48656c6c6f` 形式の HEX を選択でき、結果は HEX (大文字) と 10 進の両方で表示。各 CRC の **多項式・初期値・反射・XOR-out** をテーブル表示するので、組み込み機器のスペックシートと突き合わせる用途にも。すべてブラウザ内で完結、外部送信は一切なし。