Hash Identifier

按长度和格式识别哈希类型 — MD5、SHA-1、SHA-256 等

哈希字符串

本地运行 · 粘贴密钥安全无忧

什么是哈希识别?

哈希识别是确定某个摘要由哪种密码学哈希算法生成的过程。MD5、SHA-1、SHA-256 等密码学哈希函数各自产生固定长度的输出,而输出长度是识别未知哈希的主要依据。当你在数据库转储、配置文件或 API 响应中遇到十六进制字符串时,哈希识别工具会告诉你哪种算法最有可能生成了它。

每种哈希算法都将任意输入数据映射为固定长度的输出,称为摘要。MD5 始终产生 128 位(32 个十六进制字符),SHA-1 始终产生 160 位(40 个十六进制字符),SHA-256 始终产生 256 位(64 个十六进制字符)。这种确定性的输出长度使得在无需原始输入或哈希代码的情况下进行算法识别成为可能。

仅凭长度进行识别并不总是确定的。多种算法可能共享相同的输出大小——例如,SHA-256 和 SHA3-256 都产生 64 个字符的十六进制摘要。在这种情况下,哈希识别工具会按出现频率列出候选算法列表。来源系统、编码格式(十六进制还是 Base64)以及算法前缀(如 bcrypt 的 '$2b$')等上下文信息可进一步缩小范围。

为什么使用哈希识别工具?

未知哈希在安全审计、数据库迁移和取证分析中经常出现。哈希识别工具消除猜测,在数秒内指向正确的算法。

即时检测
粘贴哈希值,立即获得候选算法。无需手动统计字符数或查阅参考表——工具自动将十六进制长度映射到所有匹配的算法。
🔒
隐私优先分析
所有识别操作完全在浏览器中通过 JavaScript 运行。哈希值不会离开你的设备,这在分析密码哈希、身份验证令牌或敏感取证证据时尤为重要。
📋
完整的算法覆盖
支持检测 MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 及其对应的 SHA-3 变体。参考表涵盖完整的 SHA-2 和 SHA-3 系列,以及 RIPEMD-160 和 BLAKE2 等常见替代方案。
🚫
无需账号或安装
在任何现代浏览器中即时可用。无需注册、无需 API 密钥、无需安装 CLI 工具。收藏后随时使用,无论何种操作系统、何种设备。

哈希识别工具的使用场景

安全审计
在渗透测试中,识别泄露数据库中的密码哈希算法可确定破解策略。MD5 和 SHA-1 哈希表明保护强度较弱,应优先列入修复计划。
数据库迁移
在系统间迁移用户记录时,必须知道存储的密码哈希算法,才能正确配置新的身份验证层。算法识别错误将导致所有登录失败。
DevOps 与 CI/CD
构建流水线通常包含用于制品验证的校验和。识别校验和是 SHA-256 还是 SHA-512,可确保在部署脚本中使用正确的验证命令。
数字取证
取证人员在文件完整性日志、区块链记录和证据元数据中会遇到哈希摘要。识别算法是验证证据监管链的前提条件。
API 集成
第三方 API 有时会返回哈希值而不说明所用算法。从响应中识别哈希类型,可让你正确配置 webhook 签名验证或校验和校验逻辑。
学习密码学
正在学习密码学课程的学生可以粘贴不同算法生成的哈希值,立即观察算法选择、输出长度与安全属性之间的关系。

哈希算法长度参考

下表列出了常见哈希算法对应的输出位数、十六进制字符数和原始字节数。这是哈希识别工具使用的主要查询表。当多种算法共享相同的十六进制长度时,需要额外的上下文信息加以区分。

算法位数十六进制字符数字节数备注
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

区分相同长度的哈希

部分十六进制长度对应多种算法。最常见的两种歧义是 64 字符哈希(SHA-256 与 SHA3-256)和 40 字符哈希(SHA-1 与 RIPEMD-160)。以下是在仅凭长度无法区分时的判断方法。

64 个十六进制字符:SHA-256 与 SHA3-256
两者均产生 256 位(64 字符)摘要。SHA-256 在实践中使用率极高——Git 提交、TLS 证书、Bitcoin 区块以及大多数 API 签名均采用 SHA-256。SHA3-256 通常只出现在明确要求符合 NIST SP 800-185 规范或基于 Keccak 构造的系统中。请查阅来源系统的文档以确认。
40 个十六进制字符:SHA-1 与 RIPEMD-160
SHA-1 是使用更广泛的 160 位哈希——历史上曾用于 Git(SHA-256 过渡之前)、TLS 和代码签名。RIPEMD-160 主要出现在 Bitcoin 地址生成中(HASH160 = SHA-256 后接 RIPEMD-160)。如果哈希来自加密货币相关场景,应考虑 RIPEMD-160;否则 SHA-1 是更可能的候选。

代码示例

以下是四种语言中通过十六进制长度识别哈希的可运行实现。每个函数都会验证十六进制编码,查找字符数,并返回所有匹配的算法。

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)

常见问题

哈希识别是如何工作的?
哈希识别主要依赖十六进制编码摘要的长度。每种哈希算法产生固定数量的输出位:MD5 输出 128 位(32 个十六进制字符),SHA-1 输出 160 位(40 个十六进制字符),SHA-256 输出 256 位(64 个十六进制字符),以此类推。识别工具测量字符串长度,验证其仅包含十六进制字符,并将其映射到已知的算法输出大小。
哈希识别工具能否确定性地判断出具体算法?
不一定。多种算法可能产生相同的输出长度。SHA-256 和 SHA3-256 都输出 64 个十六进制字符,SHA-1 和 RIPEMD-160 都输出 40 个十六进制字符。在这种情况下,工具会返回所有候选算法。需要依靠上下文——来源系统、文档或算法前缀——才能缩小到单一算法。
如果我的哈希是 Base64 编码而非十六进制怎么办?
Base64 编码的哈希使用不同的字符集(A-Z、a-z、0-9、+、/),其长度也与十六进制形式不同。256 位哈希对应 44 个 Base64 字符,但对应 64 个十六进制字符。请先将 Base64 字符串解码为原始字节,再检查字节长度:16 字节 = MD5,20 字节 = SHA-1,32 字节 = SHA-256,48 字节 = SHA-384,64 字节 = SHA-512。
将密码哈希粘贴到在线识别工具中是否安全?
本工具完全在浏览器中运行——不会向任何服务器传输数据,哈希值不会离开你的设备。如需在正式审计中获得最高操作安全性,可通过浏览器开发者工具的网络面板验证这一点,也可在页面加载后离线使用该工具。
MD5 已在密码学上被破解,为何仍在使用?
MD5 在碰撞抗性方面已被破解——攻击者可以构造两个不同的输入产生相同的哈希。但 MD5 仍用于非安全场景:下载验证的文件校验和、缓存键、去重以及 HTTP 中的 ETag。在这些用途中,意外碰撞的概率极低,蓄意攻击也不是关注点。MD5 绝不能用于密码哈希、数字签名或证书验证。
如何识别 bcrypt、scrypt 或 Argon2 哈希?
bcrypt、scrypt 和 Argon2 等密码哈希函数使用特有的字符串前缀,而非原始十六进制输出。bcrypt 哈希以 '$2a$'、'$2b$' 或 '$2y$' 开头,后跟成本因子。Argon2 哈希以 '$argon2id$' 或 '$argon2i$' 开头。scrypt 哈希通常以 '$scrypt$' 开头。这些不是原始密码学摘要,因此基于长度的识别方法不适用——前缀本身即可识别算法。
SHA-2 与 SHA-3 有什么区别?
SHA-2(包含 SHA-256、SHA-384 和 SHA-512)基于由美国国家安全局设计并在 FIPS 180-4 中标准化的 Merkle-Damgard 构造。SHA-3(SHA3-256、SHA3-384、SHA3-512)基于 Keccak 海绵构造,通过公开的 NIST 竞赛选出并在 FIPS 202 中标准化。两者在相同安全级别下产生相同的输出长度,但使用根本不同的内部结构。SHA-3 被设计为一种备选方案,以防 SHA-2 中发现结构性弱点,尽管目前尚未发现此类弱点。