ハッシュ方式の判定方法【文字列表現から特定】

· · ハッシュ, セキュリティ, パスワード, 既存資産活用, 技術調査

まず結論

ハッシュ値の文字列から方式を見分けるときは、次の順で見るのが効率的です。

  1. 接頭辞(prefix)があるか - あればほぼ特定できる
  2. 区切り文字が何か - $ 区切りは crypt 系の可能性が高い
  3. 文字集合が何か - 16進か、Base64か、crypt系のアルファベットか
  4. 長さが何バイト相当か - 候補を絞る材料になるが、確定はできない
  5. 保存元の文脈 - /etc/shadow.htpasswd か、Django か

最も重要なのは次の 2 点です。

  • 接頭辞付きの保存形式($argon2id$... など)は文字列だけでほぼ特定できる
  • プレーンな 16 進や Base64 だけでは候補を絞ることしかできない

接頭辞で特定できるもの(一覧)

見た目の特徴 方式 補足
$argon2id$... Argon2id PHC文字列形式。v=, m=, t=, p= が続く
$argon2i$... Argon2i 同上
$2a$... / $2b$... / $2y$... bcrypt 2桁コスト付き
$1$... md5crypt Unix系MD5パスワード保存形式
$5$... sha256crypt plain SHA-256 ではない
$6$... sha512crypt plain SHA-512 ではない
$apr1$... Apache APR1-MD5 .htpasswd でよく見る
{SHA}... SHA-1 digest の Base64 Apache/LDAP系
{SSHA}... salted SHA-1 LDAP系
pbkdf2_sha256$... PBKDF2-HMAC-SHA256 Djangoなど
{bcrypt}$2b$... bcrypt(Spring Securityラッパー付き) Spring Securityの {id} 形式

プレーンな 16 進 / Base64 の長さと候補

生バイト長 16進文字数 主な候補
4 8 CRC32
16 32 MD5, MD4, NTLM系
20 40 SHA-1, RIPEMD-160
28 56 SHA-224, SHA-512/224
32 64 SHA-256, SHA3-256, BLAKE2s-256, BLAKE3
48 96 SHA-384, SHA3-384, BLAKE2b-384
64 128 SHA-512, SHA3-512, BLAKE2b-512, Whirlpool

注意: 長さが一致しても方式は一意に決まりません。特に 32/64/128 桁の 16 進は候補が多いため、これだけで断定すると外しやすいです。

実務での判定手順

1. まず先頭の記号を見る

最初の数文字でかなり絞れます。$argon2id$ なら Argon2、$2b$ なら bcrypt、$6$ なら sha512crypt といった具合です。「アルゴリズム本体」だけでなく「保存形式」も見ることが重要です。

2. 区切り文字の数を見る

$ が複数ある → パラメータ/salt/hash を一緒に持つ形式。{name} で始まる → LDAP/Spring Security 系。区切りが多い文字列ほど方式を特定しやすいです。

3. 文字種を見る

  • [0-9a-fA-F] のみ → 16進表現(文字数÷2=生バイト長)
  • + / = あり → 通常の Base64
  • - _ あり → Base64url
  • ./ が混ざり $ 区切り → crypt 系のアルファベット(bcrypt, sha256crypt など)

4. 長さを数える(候補を絞るため)

16進なら 生バイト長 = 文字数 / 2、Base64 なら 文字数 ≒ 4 × ceil(生バイト長 / 3) で計算します。ただし長さだけで確定はしないでください。

5. 文脈で確定する

保存元(/etc/shadow.htpasswd、Django の auth_user、Spring Security の認証テーブルなど)を確認すれば、ほぼ 100% 確定できます。

よくある誤判定

  • 64 hex = SHA-256 と決め打ちする - SHA3-256, BLAKE2s-256 も同じ長さ
  • $6$ を plain SHA-512 と誤解する - これは sha512crypt というパスワードハッシュ文字列
  • {SHA} を「SHA-256 か SHA-512 か」と思う - Apache/LDAP では Base64 化した SHA-1 digest を指す
  • パスワードハッシュとコンテンツハッシュを同じ扱いにする - 目的が全く異なる

まとめ

  1. prefix があるか → ほぼ特定可能
  2. 区切り文字が何か → $ 区切りは crypt 系
  3. 文字集合が何か → . が入っていれば Base64 ではないかも
  4. 長さが何バイト相当か → 候補群を作る材料
  5. 保存元の文脈 → 最終確定

接頭辞付きの保存形式はかなり特定しやすい一方、単なる 16 進/Base64 は候補を絞るまでしかできません。100% 確定が必要なら、保存元の製品・設定・コードまで確認しましょう。

関連する記事

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

関連トピック

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

このテーマがつながるサービス

この記事は次のサービスページにつながります。近い入口からご覧ください。

ブログ一覧に戻る