はじめに
ハッシュを「割る」前に、
まずそれが何者かを見抜けていますか?
パスワードハッシュの識別は、ペネトレーションテスト・フォレンジック・CTF など、あらゆるセキュリティ分野で登場する基本スキルです。
しかし意外と「hashid に投げるだけ」で終わっている人も多い。
本記事では、
人間の目で判断できるポイント → ツール → 実務判断
という流れで、ハッシュ識別を体系的に整理します。
1. なぜハッシュを識別する必要があるのか
目的は単純です。
- クラックできるのか?
- できるなら どれくらいのコスト か?
- そもそも やる価値があるか?
アルゴリズムを誤認すると:
- 一生終わらない brute force
- 無意味な wordlist 攻撃
- GPU がただの暖房器具になる ☠️
識別 = 戦略決定 です。
2. 第一印象で分かること:長さと文字種
まずはツール禁止。目視だけで見ます。
よくあるハッシュの特徴
| 例 | 文字数 | 文字種 | 高確率のアルゴリズム |
|---|---|---|---|
5f4dcc3b5aa765d61d8327deb882cf99 |
32 | 16進数 | MD5 |
356a192b7913b04c54574d18c28d46e6395428ab |
40 | 16進数 | SHA-1 |
e3b0c44298fc1c149afbf4c8996fb924... |
64 | 16進数 | SHA-256 |
$2y$10$... |
可変 | Base64 + $
|
bcrypt |
$6$salt$hash |
可変 |
$ 区切り |
SHA-512 crypt |
覚えておく指針
- 固定長 + hex → 古典ハッシュ
-
$algo$salt$hash→ Unix 系 / KDF - Base64 っぽい + ランダム感強 → 遅いハッシュ
3. 構造を見る:$ は正義
現代的なパスワードハッシュは、
「自分は何者か」を文字列に含める設計が主流です。
代表的な形式
-
bcrypt
$2a$12$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -
MD5 crypt
$1$salt$hash -
SHA-512 crypt
$6$salt$hash -
PBKDF2(Django / Flask)
pbkdf2_sha256$260000$salt$hash
💡 $数字$ や $アルゴリズム名$ が見えたら
→ ほぼ勝ちです。
4. 文脈を読む:ハッシュは単独で存在しない
これは初心者が一番見落としがちな点です。
どこから来たハッシュか?
| 入手元 | 典型的アルゴリズム |
|---|---|
/etc/shadow |
$1$ MD5 / $5$ SHA-256 / $6$ SHA-512 |
| WordPress | phpass (MD5 派生) |
| Django | PBKDF2 |
| Laravel | bcrypt |
| Windows SAM | NTLM |
文脈 > 文字列
現場ではこの逆転が頻繁に起きます。
5. ツールによる補助(盲信しない)
人間の判断を 確認するため に使います。
よく使われるツール
hashid <hash>
hashcat --example-hashes
注意点:
- hashid は「推測」
- 短いハッシュは誤判定が多い
- 独自実装はまず当たらない
6. クラック可能性の現実的評価
識別のゴールはここです。
| アルゴリズム | 難易度 | 実務評価 |
|---|---|---|
| MD5 / SHA-1 | ★ | ほぼ平文 |
| SHA-256 | ★★ | GPU 次第 |
| NTLM | ★★ | 辞書で即死 |
| bcrypt | ★★★★ | cost 次第 |
| PBKDF2 | ★★★★ | 時間勝負 |
| Argon2 | ★★★★★ | 現代最強 |
セキュリティ界の皮肉:
「会議中に割れるなら、それはもう秘密じゃない」
7. 実戦フロー(これだけ覚えればOK)
ハッシュ取得
↓
長さ・文字種を見る
↓
$ 構造を確認
↓
取得元の文脈を考慮
↓
hashid / hashcat で確認
↓
割る?捨てる?戦略決定
おわりに
ハッシュ識別は、
技術というより「判断力」 です。
- 早く気づく
- 無駄をしない
- 資源を正しく使う
これはそのまま、
良いセキュリティエンジニアの資質でもあります。