はじめに
「この文字列、MD5?SHA-1?NTLM?bcrypt? どれ?」
CTFでも診断でも運用でも、まず最初にぶつかるのがこの“正体当て”問題です。
そこで便利なのが hashID。
これは ハッシュ値の“見た目”からアルゴリズム候補を推測するツール/Pythonライブラリです。
重要:hashIDは クラックしません。あくまで「推測して候補を出す」だけ。
hashID とは?
hashID = ハッシュ識別(hash identification)用ツール
長さ・文字種・プレフィックス($1$ や $6$)・フォーマットなどの特徴から、該当しそうな方式を列挙します。
- ✅ 候補を複数提示(現実的で良い)
- ✅ confidence(確度)も出せる
- ❌ “確定”はできない(似てる形式が多い)
- ❌ “解析”や“復元”はしない
インストール
pip install hashID
(KaliなどだとCLIツール hashid が入ってる場合もあります)
Pythonでの基本的な使い方
1つのハッシュを判定する
from hashid import HashID
h = HashID()
hash_value = "5f4dcc3b5aa765d61d8327deb882cf99" # 例: "password" のMD5
results = h.identifyHash(hash_value)
for r in results:
print(f"{r.name:15} hashcat={r.hashcat} john={r.john}")
出力イメージ(例):
MD2 hashcat=None john=md2
MD5 hashcat=0 john=raw-md5
MD4 hashcat=900 john=raw-md4
Double MD5 hashcat=2600 john=None
ポイント
- 似た形式(例:MD5 と NTLM)は長さが同じなので両方候補に上がることがあります
複数行(hashes.txt)をまとめて判定する例
from pathlib import Path
from hashid import HashID
BASE_DIR = Path(__file__).resolve().parent
hashes_path = BASE_DIR / "hashes.txt"
h = HashID()
with open(hashes_path, "r", encoding="utf-8") as f:
for line in f:
hv = line.strip()
if not hv or hv.startswith("#"):
continue
print(f"source: {hv}")
results = h.identifyHash(hv) or []
for r in results:
if r.hashcat is not None:
print(f" {r.name:12} -> hashcat -m {r.hashcat}")
print("")
実戦でよく出るパターン(見た目のヒント)
/etc/shadow でよく見るやつ
-
$1$...→ md5crypt 系 -
$5$...→ sha256crypt 系 -
$6$...→ sha512crypt 系 -
$2y$...→ bcrypt 系
こういうプレフィックス付きは、hashIDの推測精度が比較的高いです。
hashID の限界(ここが一番大事)
1) “確定”できない
例:32 hex は MD5 っぽいけど NTLM も同じ見た目。
hashIDは候補を出してくれるけど、最後は 検証 が必要です。
2) ソルト入り・アプリ独自形式は当たりにくい
Webアプリやフレームワークは独自フォーマットや複合形式が多く、推測がブレやすいです。
3) 文字列が“ハッシュ”とは限らない
Base64、UUID、ランダムトークン、署名、暗号文…
「ハッシュっぽいだけ」のものも多いので、前後の文脈が重要。
hashID の正しい使いどころ(おすすめ運用)
hashIDは「最初の5分で迷子にならない」ための道具です。
- CTFでhashcat / Johnのモード選択前
- 侵害調査で漏えいデータの形式を素早く分類
- 運用で古い設定・DB dumpのパスワード列調査(監査目的)
ありがちな失敗と対策
失敗:候補の先頭を盲信して時間を溶かす
対策
- 同じ長さの候補(MD5/NTLMなど)を並行して試す
- 可能なら“出どころ”を見る(Windows系ならNTLM寄り、など)
失敗:入力が整形されてなくて判定が崩れる
対策
- 改行・空白・引用符・
hash:salt形式を事前に整える -
/etc/shadowなら “丸ごと1行” が必要な場合もある
まとめ
- hashID は「ハッシュの正体当て」を高速化するためのPythonライブラリ
- できること:候補の列挙(confidence付き)
- できないこと:確定・復元・クラック
- 最強の使い方:
hashIDで候補 → hashcat/Johnで検証(実証がゴール)