Hash Identifier

ハッシュタイプを長さとフォーマットで識別 — MD5、SHA-1、SHA-256など

ハッシュ文字列

ローカルで実行 · シークレットの貼り付けも安全

ハッシュ識別とは何か

ハッシュ識別とは、与えられたダイジェストがどの暗号ハッシュアルゴリズムによって生成されたかを特定するプロセスです。MD5、SHA-1、SHA-256 などの暗号ハッシュ関数はそれぞれ固定長の出力を生成し、その出力長が未知のハッシュを識別する際の主要な手がかりとなります。データベースダンプ、設定ファイル、または API レスポンスで16進数文字列を見かけた際、ハッシュ識別ツールはどのアルゴリズムが生成した可能性が高いかを教えてくれます。

すべてのハッシュアルゴリズムは、任意の入力データをダイジェストと呼ばれる固定サイズの出力にマップします。MD5 は常に128ビット(16進数32文字)、SHA-1 は常に160ビット(16進数40文字)、SHA-256 は常に256ビット(16進数64文字)を出力します。この決定論的な出力長こそが、元の入力やハッシュコードにアクセスせずともアルゴリズムの識別を可能にする仕組みです。

長さだけによる識別が必ずしも確定的とは限りません。複数のアルゴリズムが同じ出力サイズを持つ場合があります。例えば、SHA-256 と SHA3-256 はどちらも16進数64文字のダイジェストを生成します。このような場合、ハッシュ識別ツールは出現頻度順にランク付けされた候補アルゴリズムのリストを返します。ソースシステム、エンコード形式(hex か Base64 か)、またはアルゴリズムプレフィックスの有無(bcrypt の '$2b$' など)といったコンテキスト情報によって候補をさらに絞り込むことができます。

ハッシュ識別ツールを使う理由

不明なハッシュは、セキュリティ監査、データベース移行、フォレンジック調査の現場で日常的に登場します。ハッシュ識別ツールは推測作業を排除し、数秒で正しいアルゴリズムを特定します。

即時検出
ハッシュを貼り付けるだけで候補アルゴリズムを即座に取得できます。手動での文字数カウントや参照テーブルの確認は不要です。ツールが16進数の長さから一致するすべてのアルゴリズムへのマッピングを自動的に行います。
🔒
プライバシー優先の解析
識別処理はすべて JavaScript を使用してブラウザ内で完結します。ハッシュ値がデバイス外に送信されることはありません。これはパスワードハッシュ、認証トークン、または機密性の高いフォレンジック証拠を解析する際に重要な点です。
📋
包括的なアルゴリズム対応
MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 およびそれぞれの SHA-3 対応版を検出します。参照テーブルは SHA-2 と SHA-3 のファミリー全体に加え、RIPEMD-160 や BLAKE2 などの代替アルゴリズムもカバーしています。
🚫
アカウントやインストール不要
あらゆる最新ブラウザで即座に動作します。サインアップ不要、API キー不要、CLI ツールのインストール不要。ブックマークしておけば、未知のハッシュに遭遇するたびに、どの OS やデバイスからでも利用できます。

ハッシュ識別ツールのユースケース

セキュリティ監査
ペネトレーションテストでは、流出したデータベース内のパスワードハッシュアルゴリズムを特定することでクラッキング手法が決まります。MD5 や SHA-1 のハッシュは保護が脆弱であることを示しており、修正対応の優先度を高く設定できます。
データベース移行
システム間でユーザーレコードを移行する際、新しい認証層を正しく設定するために保存されたパスワードハッシュのアルゴリズムを把握しておく必要があります。アルゴリズムを誤って識別すると、すべてのログインが失敗します。
DevOps と CI/CD
ビルドパイプラインにはアーティファクト検証用のチェックサムが含まれることがよくあります。チェックサムが SHA-256 か SHA-512 かを識別することで、デプロイスクリプトで正しい検証コマンドを使用できます。
デジタルフォレンジック
フォレンジック調査官は、ファイル整合性ログ、ブロックチェーン記録、証拠メタデータでハッシュダイジェストに遭遇します。アルゴリズムを特定することは、証拠の保管連鎖を検証するための前提条件となります。
API 連携
サードパーティの API はアルゴリズムを明記せずにハッシュ値を返すことがあります。レスポンスからハッシュの種類を識別することで、Webhook 署名検証やチェックサム検証を正しく設定できます。
暗号技術の学習
暗号技術の講座を受講している学生は、異なるアルゴリズムで生成したハッシュを貼り付けることで、アルゴリズムの選択・出力長・セキュリティ特性の関係をすぐに確認できます。

ハッシュアルゴリズム長さ参照表

以下の表は、一般的なハッシュアルゴリズムとそのビット数・16進数文字数・生バイト数の対応を示しています。これはハッシュ識別ツールで使用される主要な参照テーブルです。複数のアルゴリズムが同じ16進数の長さを共有する場合は、識別のために追加のコンテキストが必要です。

アルゴリズムビット16進数文字数バイト備考
MD51283216Broken — collisions trivial since 2004
SHA-11604020Deprecated — SHAttered attack (2017)
SHA-2242245628Truncated SHA-256; rarely used standalone
SHA-2562566432Current standard; TLS, Git, Bitcoin
SHA-3843849648Truncated SHA-512; CNSA Suite approved
SHA-51251212864Maximum SHA-2 output; large-data hashing
SHA3-2562566432Keccak-based; NIST alternative to SHA-2
SHA3-51251212864Keccak-based; highest SHA-3 strength
RIPEMD-1601604020Used in Bitcoin address derivation
BLAKE2s2566432Faster than SHA-256; 256-bit output

ハッシュ長の曖昧さを解消する

一部の16進数の長さは複数のアルゴリズムに対応します。最も多い曖昧なケースは、64文字のハッシュ(SHA-256 対 SHA3-256)と40文字のハッシュ(SHA-1 対 RIPEMD-160)の2つです。長さだけでは不十分な場合に見分ける方法を以下に示します。

16進数64文字: SHA-256 対 SHA3-256
どちらも256ビット(64文字)のダイジェストを生成します。実際には SHA-256 が圧倒的に多く使われており、Git コミット、TLS 証明書、Bitcoin ブロック、ほとんどの API 署名に使用されています。SHA3-256 は、NIST SP 800-185 準拠または Keccak ベースの構造を明示的に要求するシステムでのみ見られます。確認にはソースシステムのドキュメントを参照してください。
16進数40文字: SHA-1 対 RIPEMD-160
SHA-1 は160ビットハッシュの中で最も広く普及しており、Git(SHA-256 移行前)、TLS、コード署名などで歴史的に使用されてきました。RIPEMD-160 は主に Bitcoin アドレス生成(HASH160 = SHA-256 の後に RIPEMD-160)で見られます。ハッシュが暗号通貨のコンテキスト由来であれば RIPEMD-160 を検討し、そうでなければ SHA-1 が有力な候補です。

コード例

以下は、4つの言語における16進数の長さによるハッシュ識別の実装例です。各関数は16進数エンコードを検証し、文字数を参照して、一致するすべてのアルゴリズムを返します。

JavaScript
function identifyHash(hex) {
  const len = hex.length
  const isHex = /^[0-9a-fA-F]+$/.test(hex)
  if (!isHex) return ['Not a hex-encoded hash']

  const map = {
    32:  ['MD5'],
    40:  ['SHA-1', 'RIPEMD-160'],
    56:  ['SHA-224', 'SHA3-224'],
    64:  ['SHA-256', 'SHA3-256', 'BLAKE2s'],
    96:  ['SHA-384', 'SHA3-384'],
    128: ['SHA-512', 'SHA3-512', 'BLAKE2b'],
  }
  return map[len] || [`Unknown (${len} hex chars)`]
}

identifyHash('d41d8cd98f00b204e9800998ecf8427e')
// → ["MD5"]

identifyHash('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')
// → ["SHA-256", "SHA3-256", "BLAKE2s"]
Python
import re

HASH_LENGTHS = {
    32:  ['MD5'],
    40:  ['SHA-1', 'RIPEMD-160'],
    56:  ['SHA-224', 'SHA3-224'],
    64:  ['SHA-256', 'SHA3-256', 'BLAKE2s'],
    96:  ['SHA-384', 'SHA3-384'],
    128: ['SHA-512', 'SHA3-512', 'BLAKE2b'],
}

def identify_hash(hex_string: str) -> list[str]:
    hex_string = hex_string.strip()
    if not re.fullmatch(r'[0-9a-fA-F]+', hex_string):
        return ['Not a hex-encoded hash']
    return HASH_LENGTHS.get(len(hex_string), [f'Unknown ({len(hex_string)} hex chars)'])

identify_hash('da39a3ee5e6b4b0d3255bfef95601890afd80709')
# → ['SHA-1', 'RIPEMD-160']

identify_hash('a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a')
# → ['SHA-256', 'SHA3-256', 'BLAKE2s']
Go
package main

import (
	"fmt"
	"regexp"
)

var hexPattern = regexp.MustCompile("^[0-9a-fA-F]+$")

var hashLengths = map[int][]string{
	32:  {"MD5"},
	40:  {"SHA-1", "RIPEMD-160"},
	56:  {"SHA-224", "SHA3-224"},
	64:  {"SHA-256", "SHA3-256", "BLAKE2s"},
	96:  {"SHA-384", "SHA3-384"},
	128: {"SHA-512", "SHA3-512", "BLAKE2b"},
}

func identifyHash(hex string) []string {
	if !hexPattern.MatchString(hex) {
		return []string{"Not a hex-encoded hash"}
	}
	if algos, ok := hashLengths[len(hex)]; ok {
		return algos
	}
	return []string{fmt.Sprintf("Unknown (%d hex chars)", len(hex))}
}

func main() {
	fmt.Println(identifyHash("d41d8cd98f00b204e9800998ecf8427e"))
	// → [MD5]
}
CLI (Bash)
#!/bin/bash
# Identify a hash from the command line by character count
hash="$1"

if [[ ! "$hash" =~ ^[0-9a-fA-F]+$ ]]; then
  echo "Not a hex-encoded hash"
  exit 1
fi

len=${#hash}
case $len in
  32)  echo "MD5 (128-bit)" ;;
  40)  echo "SHA-1 or RIPEMD-160 (160-bit)" ;;
  56)  echo "SHA-224 or SHA3-224 (224-bit)" ;;
  64)  echo "SHA-256 or SHA3-256 (256-bit)" ;;
  96)  echo "SHA-384 or SHA3-384 (384-bit)" ;;
  128) echo "SHA-512 or SHA3-512 (512-bit)" ;;
  *)   echo "Unknown hash length: $len chars" ;;
esac

# Usage: ./identify.sh d41d8cd98f00b204e9800998ecf8427e
# → MD5 (128-bit)

よくある質問

ハッシュ識別はどのように機能しますか?
ハッシュ識別は主に16進数エンコードされたダイジェストの長さに依存しています。各ハッシュアルゴリズムは固定数の出力ビットを生成します。MD5 は128ビット(16進数32文字)、SHA-1 は160ビット(16進数40文字)、SHA-256 は256ビット(16進数64文字)を出力します。識別ツールは文字列の長さを測定し、16進数文字のみで構成されていることを確認し、既知のアルゴリズム出力サイズにマップします。
ハッシュ識別ツールは正確なアルゴリズムを確実に特定できますか?
常に可能とは限りません。複数のアルゴリズムが同じ出力長を持つ場合があります。SHA-256 と SHA3-256 はどちらも16進数64文字を出力します。SHA-1 と RIPEMD-160 はどちらも16進数40文字を出力します。このような場合、ツールはすべての候補を返します。単一のアルゴリズムに絞り込むには、ソースシステム、ドキュメント、またはアルゴリズムプレフィックスといったコンテキストが必要です。
ハッシュが16進数ではなく Base64 エンコードされている場合はどうすればよいですか?
Base64 エンコードされたハッシュは異なる文字セット(A-Z、a-z、0-9、+、/)を使用し、16進数相当と比べて長さが異なります。256ビットのハッシュは Base64 では44文字ですが、16進数では64文字です。まず Base64 文字列を生バイトにデコードしてからバイト長を確認してください。16バイト = MD5、20バイト = SHA-1、32バイト = SHA-256、48バイト = SHA-384、64バイト = SHA-512 となります。
パスワードハッシュをオンライン識別ツールに貼り付けても安全ですか?
このツールはすべてブラウザ内で動作します。データはいかなるサーバーにも送信されず、ハッシュはデバイス外に出ることはありません。ただし、正式な監査における最大限の運用セキュリティのためには、ブラウザの開発者ツールのネットワークタブを確認するか、ページ読み込み後にオフラインでツールを使用することで検証できます。
MD5 は暗号学的に破られているのに、なぜいまだに使われているのですか?
MD5 は衝突耐性が破られており、攻撃者は同じハッシュを生成する2つの異なる入力を作成できます。しかし MD5 はセキュリティ以外の用途では依然として使用されています。ダウンロード検証用のファイルチェックサム、キャッシュキー、重複排除、HTTP の ETag などがその例です。これらの用途では偶発的な衝突は天文学的に起こりにくく、意図的な攻撃も問題になりません。ただし、パスワードハッシュ、デジタル署名、証明書検証には MD5 を使用してはいけません。
bcrypt、scrypt、または Argon2 のハッシュを識別するにはどうすればよいですか?
bcrypt、scrypt、Argon2 のようなパスワードハッシュ関数は、生の16進数出力ではなく特徴的な文字列プレフィックスを使用します。bcrypt のハッシュは '$2a$'、'$2b$'、または '$2y$' で始まり、その後にコストファクターが続きます。Argon2 のハッシュは '$argon2id$' または '$argon2i$' で始まります。scrypt のハッシュは通常 '$scrypt$' で始まります。これらは生の暗号ダイジェストではないため、長さに基づく識別は適用されません。プレフィックス自体がアルゴリズムを識別します。
SHA-2 と SHA-3 の違いは何ですか?
SHA-2(SHA-256、SHA-384、SHA-512 を含む)は NSA が設計し FIPS 180-4 で標準化された Merkle-Damgard 構造に基づいています。SHA-3(SHA3-256、SHA3-384、SHA3-512)は公開された NIST コンペティションで選定され FIPS 202 で標準化された Keccak スポンジ構造に基づいています。同等のセキュリティレベルでは同じ出力長を生成しますが、内部構造は根本的に異なります。SHA-3 は SHA-2 に構造的な脆弱性が発見された場合のフォールバックとして設計されましたが、そのような脆弱性はまだ実証されていません。