ハッシュ値の桁数でアルゴリズムを見分ける方法 - MD5/SHA-1/SHA-256/SHA-512
16進数表記されたハッシュ値なら、文字数から候補となるアルゴリズムを素早く絞れます。ただし、同じ長さの出力を持つ別方式やエンコード形式もあるため、桁数だけで100%断定はできません。
For hexadecimal digests, MD5 commonly has 32 characters, SHA-1 40, SHA-256 64, and SHA-512 128. Length is only a clue because other algorithms, encodings, salts, and storage formats can share or change these lengths.
1. ビット長と16進数文字数の関係
16進数1文字は4ビットを表します。1バイト(8ビット)は2文字になるため、16進数の文字数はハッシュのビット長を4で割った値です。
16進数文字数 = ビット長 / 4
SHA-256: 256 / 4 = 64文字
SHA-512: 512 / 4 = 128文字2. アルゴリズムと桁数の対応表
| アルゴリズム | ビット長 | バイト数 | 16進数文字数 |
|---|---|---|---|
| MD5 | 128ビット | 16 | 32文字 |
| SHA-1 | 160ビット | 20 | 40文字 |
| SHA-256 | 256ビット | 32 | 64文字 |
| SHA-512 | 512ビット | 64 | 128文字 |
この対応はダイジェスト全体を16進数で表した場合です。ハイフン、接頭辞、ソルト、パラメータを含む保存形式には、そのまま当てはめられません。
3. 文字列から候補を絞る
5d41402abc4b2a76b9719d911017c592
# 32文字: MD5の可能性
2cf24dba5fb0a30e26e83b2ac5b9e29e
1b161e5c1fa7425e73043362938b9824
# 改行を除いて64文字: SHA-256の可能性まず 0-9 と a-f(大文字も可)だけの16進数か確認します。候補を得たら、生成元の設定やドキュメントで確定します。
表示が複数行に折り返されていても、実データに改行が含まれるとは限りません。コピーした値の前後の空白を除き、文字種と長さを別々に確認するのが基本です。
4. bcryptや/etc/shadowは独自フォーマット
$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
|---| |---------------- salt + hash ----------------|
識別子・コストbcryptは固定長の16進数ハッシュ値ではありません。$2b$10$... のようにアルゴリズム識別子、コスト、ソルト、ハッシュ本体を含む独自フォーマットで、通常は全体で60文字です。
Linuxの /etc/shadow でも、値全体は生のSHAダイジェストではなく、識別子やソルトなどを含むcrypt形式で保存されます。たとえば次の $6$ は一般にSHA-512-cryptを示しますが、後続の文字列全体を「128桁の生SHA-512」として数えるものではありません。
user:$6$rounds=5000$exampleSalt$encodedHashValue:...
| | |
方式ID パラメータ等 エンコード済みハッシュ部ここでの exampleSalt と encodedHashValue は構造説明用です。実際のshadowエントリはOSや設定により異なり、アカウント名やパスワード変更日などはコロン区切りの別フィールドです。解析時は閲覧権限と機密性にも注意してください。
5. Base64・接頭辞・区切り記号を見分ける
| 見た目 | 考えられる形式 | 最初の確認 |
|---|---|---|
0-9a-f のみ | 16進数ダイジェスト | 文字数を数える |
A-Z a-z 0-9 + / と末尾の = | 標準Base64の可能性 | デコード後のバイト数を見る |
$2b$... | bcrypt | 識別子とコストを読む |
$6$... | SHA-512-cryptの可能性 | crypt形式の仕様として読む |
sha256: など | 方式を示す接頭辞付き | 生成元の仕様で接頭辞を確認 |
SHA-256の32バイトを標準Base64で表すと通常44文字(末尾のパディングを含む)になり、16進数の64文字とは一致しません。URL-safe Base64では + と / が - と _ に置き換わり、パディングが省略される場合もあります。
6. 未知の値を推理する実践例
次の値だけを渡され、「何のハッシュか調べてほしい」と言われた場面を考えます。
2cf24dba5fb0a30e26e83b2ac5b9e29e
1b161e5c1fa7425e73043362938b9824- 画面上では2行ですが、改行を除いて連結すると64文字です。
- 文字は
0-9とa-fだけなので、16進数として妥当です。 64 × 4 = 256ビットなので、SHA-256が有力候補になります。- 接頭辞やソルトは見えませんが、別の256ビット方式や切り出したデータの可能性は残ります。
- 生成元のAPI仕様、コード、ファイルのチェックサム欄を確認してSHA-256か確定します。
参考として、この例は文字列 hello のSHA-256です。ただし、既知文字列との一致はこの例の由来を示すだけで、一般に未知の値の方式を長さだけから証明する方法ではありません。
7. hashidなどの判定支援ツール
hashid や name-that-hash のように、文字種・長さ・接頭辞のパターンから候補を列挙するCLIツールもあります。大量のサンプルを一次分類するときは便利ですが、同じ特徴を持つ候補が複数表示されることがあります。
# 導入方法やオプションは各ツールの公式説明を確認
hashid "5d41402abc4b2a76b9719d911017c592"
name-that-hash "5d41402abc4b2a76b9719d911017c592"これらはパターン推定を自動化するもので、暗号学的にアルゴリズムを証明するものではありません。また、未知の機密値をオンライン判定サイトへ送信すると漏えいにつながるため、組織のルールに従い、必要ならローカルで動くツールを使います。
8. 桁数だけでは断定できない理由
- 別アルゴリズムでも同じビット長になり得る: 64文字ならSHA-256が有力でも、256ビットを出す別方式かもしれません。
- Base64では長さが変わる: 同じバイト列でも16進数とは文字数や文字種が異なります。
- ソルトや接頭辞が結合される: パラメータを一緒に保存するとダイジェスト単体より長くなります。
- 切り詰められる場合がある: 出力の一部だけなら元のビット長を復元できません。
文字数はあくまで有力な手がかりです。確実な判定には、生成したコード、ライブラリ設定、データ形式の仕様書を確認してください。
さらにHMACは秘密鍵を使うメッセージ認証コードですが、HMAC-SHA-256の出力長は生のSHA-256と同じ256ビットになり得ます。長さが同じでも用途と計算方法は異なります。保存システムが任意の長さへ切り詰めている場合も、元方式は逆算できません。
よくある間違いと直し方
- 64文字なら必ずSHA-256と断定する: 「有力候補」とし、生成元の仕様で確定する。
- Base64を16進数として数える: まず文字種とパディングを確認する。
- bcryptを生のハッシュ値と扱う:
$2b$、コスト、ソルトを含む形式として読む。 $6$全体を生SHA-512とみなす: SHA-512-cryptの構造とエンコードを確認する。- 表示上の改行や空白も数える: 実データの区切りか単なる折り返しかを確認する。
- 接頭辞をダイジェスト本体へ含める: 仕様書で識別子、ソルト、本体を分離する。
- 大文字を16進数ではないと判断する:
A-Fも有効な16進数字。 - 判定ツールの第一候補を確定結果にする: 候補一覧として扱い、コードや設定で裏付ける。
English summary
Hex uses two characters per byte, so character length equals bit length divided by four: MD5 is 32, SHA-1 40, SHA-256 64, and SHA-512 128. bcrypt is different: its roughly 60-character string includes an identifier, cost, salt, and hash. Treat length only as a clue. Other algorithms can share a bit length, Base64 changes the count, and salts or prefixes may be combined with the digest. Confirm the documentation for the generating system.
Structured password formats must be parsed according to their specifications. For example, a $6$ prefix in a Linux shadow password field commonly identifies SHA-512-crypt; the complete field is not a raw 128-character SHA-512 digest. Likewise, $2b$ identifies a bcrypt format containing parameters and a salt.
Tools such as hashid and name-that-hash can rank candidates from length, alphabet, and prefixes, but they are not definitive. Remove presentation-only whitespace, identify the encoding, inspect format markers, and then confirm the generating code, library configuration, or protocol documentation. Avoid uploading confidential values to online identification services.