1519

什么时候需要哈希计算器?

哈希(摘要)是什么?

密码学哈希函数会把任意长度的输入转换为固定长度的指纹。无论输入是空串、一个单词还是整块磁盘镜像,SHA-256 永远输出 256 位(64 个十六进制字符)。

一个安全的哈希函数由三条性质定义:

抗原像(preimage resistance)——给定哈希值 h,在计算上不可行找到任何满足 hash(m) = h 的输入 m。这是"单向性"的正式表述。

抗第二原像(second-preimage resistance)——给定输入 m1,不可行找到另一个不同的输入 m2 与之哈希相同。

抗碰撞(collision resistance)——不可行找到任意两个 m1 ≠ m2 拥有相同哈希。

日常使用中你能感受到的行为:

同样的输入 → 同样的输出(确定性)

输入微小变化 → 输出面目全非(雪崩效应)

输出长度固定,与输入大小无关

无法从输出实际反推出输入

注意这个清单里没有"隐藏信息"。如果输入本身可猜(短密码、常见词),哈希不提供任何保护——攻击者逐个哈希候选输入直到撞上即可。

雪崩效应:具体例子

对 hello 和 Hello(只改了一个字母的大小写)做哈希,输出毫无关联:

MD5("hello") = 5d41402abc4b2a76b9719d911017c592

MD5("Hello") = 8b1a9953c4611296a827abf8c47804d7

SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

SHA-256("Hello") = 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

一个字符的改动让 256 位输出中约一半的比特发生翻转。这正解释了为什么隐藏空白字符、不同的换行风格(\n vs \r\n)、Unicode 规范化差异都会让"看起来一样"的文本算出不同的哈希——这也是校验和不匹配的头号原因。

算法全景图

算法摘要长度状态2026 年的合理用途MD5128 位已攻破(普通硬件几秒可造碰撞)非对抗性校验、缓存 Key、去重、ETagSHA-1160 位已攻破(2017 年 SHAttered 攻击;2020 年前后实现 chosen-prefix 碰撞)仅遗留系统兼容SHA-256256 位安全默认选择:TLS、JWT、Git、比特币、HMACSHA-384 / SHA-512384 / 512 位安全更高安全余量;SHA-512 在 64 位 CPU 上往往更快SHA-3 / BLAKE3可变安全现代替代方案;SHA-3 是完全不同的构造(Keccak 海绵结构),对攻破 SHA-1/MD5 的那类攻击免疫

"已攻破"具体指抗碰撞性质失效——攻击者可以构造两个 MD5/SHA-1 相同的文件。用 MD5 对比原作者发布的校验和来验证下载,仍然能检出意外损坏;检不出的是同时伪造了文件和校验和的攻击者。这就是安全敏感场景全面转向 SHA-256 的原因。

长度扩展攻击是另一个更隐蔽的坑:对 Merkle–Damgård 构造的哈希(MD5、SHA-1、SHA-2),任何知道某条消息哈希值的人都能算出"该消息 + 任意后缀"的哈希——而不需要知道原消息内容。所以 SHA-256(密钥 + 消息) 永远不能当签名用。HMAC 正是为消除这个漏洞而设计的。

裸哈希 vs HMAC vs 密码哈希

三件不同的工作,都构建在哈希函数之上:

裸哈希HMAC密码哈希(Argon2/bcrypt/scrypt)是否有密钥无有(共享密钥)每用户独立 salt速度快快刻意做慢 + 吃内存证明的事内容是什么内容来自持钥方即使数据库泄露也难以暴力破解典型用途校验和、去重、摘要API 签名、JWT(HS256)、Webhook存储登录凭据

密码的 SHA-256 可以在彩虹表里秒查;即使加了 salt,快速哈希也扛不住 GPU 阵列每秒 10¹⁰ 次以上的猜测。密码哈希函数用可调的 CPU 开销和(Argon2/scrypt 的)内存开销对抗这一点,让每次猜测都付出真实代价。

什么时候需要哈希计算器?

校验下载内容:对比官方提供的 checksum

去重/缓存 Key:同内容得到同摘要

数据完整性检测:检测内容在流水线各环节间是否被修改

API 请求签名准备:基于 HMAC 的签名(AWS Signature v4、Webhook secret)都从精确的摘要开始,本工具可以帮你确认代码实际哈希的到底是什么

复现公开示例:上文 SHA-256("hello") 的值可以用来对任何哈希实现做正确性抽查

示例

示例 1:对简单文本做哈希

输入 hello,选择 MD5 算法:

示例 2:空格/换行会改变结果

输入 hello 与 hello (多了尾部空格),哈希值完全不同:

安全提示(重要)

MD5 与 SHA-1 不建议用于安全用途(实用性碰撞攻击已存在)

哈希并不会"隐藏信息"。如果原文可猜(短密码、常见词),攻击者可通过穷举/字典碰撞得到原文

永远不要用 hash(密钥 + 数据) 当签名——请使用对长度扩展攻击免疫的 HMAC

存密码请使用 Argon2id / scrypt / bcrypt,而不是 MD5/SHA

排错建议

结果不符合预期时,优先检查:

是否包含隐藏空白字符(空格、\n、\r\n)

是否大小写不同

是否存在 Unicode 差异/规范化差异(é 可能是一个码点,也可能是 e + 组合重音符)

编码:本工具对 UTF-8 字节做哈希;另一个工具若按 UTF-16 或 Latin-1 字节计算,结果必然不同

确保你计算的就是"期望的那段文本"

相关工具

Base64 工具

JWT 解码 —— 观察 HMAC 签名真实 Token 的过程