哈希计算工具 — MD5、SHA-1、SHA-256、SHA-512

在线计算文本或文件的 MD5、SHA-1、SHA-256、SHA-384、SHA-512 哈希值。全部在浏览器内完成,文件不会离开你的设备。

所有处理均在你的浏览器内完成,数据不会上传。

MD5 已不可用于安全用途
SHA-1 已不可用于安全用途
SHA-256
SHA-384
SHA-512

MD5 与 SHA-1 都已有实际可行的碰撞攻击:可以构造出两份不同的内容却得到同一个哈希。用作校验和、缓存键没问题,但不能用于签名、口令,或任何伪造能让攻击者获利的场景。

使用方法

  1. 选择 文本 计算你输入内容的哈希,或选择 文件 计算本地文件的哈希。
  2. 五种哈希一次全部算出,不需要来回切换。
  3. 如果你要比对的系统用大写十六进制,打开 大写 开关。
  4. 点任意一行的复制按钮取走该值。

关于哈希

哈希函数把任意长度的输入压成一个定长指纹。相同输入永远得到相同输出,改动一个字节输出 就面目全非,而输出本身又透露不出关于输入的有用信息。正是这三条性质,让哈希成为「这两 份数据是不是同一份」的标准回答方式——不必真的去逐字节比较原数据。

问题在于,并不是所有哈希函数都还站得住。MD5 在 2004 年被攻破,当时公开了构造两个 不同输入却得到相同摘要的方法。SHA-1 在 2017 年步其后尘,Google 造出了两份 SHA-1 相同的不同 PDF。两者今天仍被大量使用——Git 至今用 SHA-1 标识对象——但都不该再用于 「伪造相同哈希能让人获利」的场合,比如签名或证书校验。

SHA-256SHA-512 同属 SHA-2 家族,目前没有实际可行的攻击。要注意 SHA-512 并不是简单地「比 SHA-256 更安全」:它使用 64 位运算,因此在 64 位硬件上反而比 SHA-256 更快,尽管摘要更长。没有特殊要求时选 SHA-256 就好。

有一个误用值得单独点出来:哈希不是加密。加密是可以用密钥还原的,这正是加密的意义; 而哈希被设计成单向的,无法用来保护你之后还要读回来的数据。同样,单纯的哈希也不足以 存储密码——原因见上面的常见问题。

常见问题

我的文件会被上传吗?

不会。文件通过浏览器的 File API 读取,由 JavaScript 在本地计算,这里根本没有能接收它的服务器。你可以打开浏览器的网络面板,一边计算一边看——不会有任何请求发出。

MD5 现在还能用吗?

凡是涉及安全的场景都不能用了。针对 MD5 的实际碰撞攻击从 2004 年就已存在,今天在一台笔记本上几秒钟就能造出两份 MD5 相同的不同文件。但如果你只是要发现「意外损坏」——校验下载是否完整、拿哈希当缓存键——MD5 完全够用。分界线在于:伪造出相同哈希,对攻击者有没有好处。

为什么浏览器不原生提供 MD5?

Web Crypto 规范刻意不收录 MD5,SHA-1 也只是为兼容历史才保留。浏览器厂商不希望一个已被攻破的算法成为最省事的选择。所以本工具的 MD5 是自己实现的,而 SHA-1 到 SHA-512 用的是浏览器原生实现。

能从哈希值反推出原文吗?

无法「反解」——哈希会丢弃信息,逆函数根本不存在。但这个保证比听起来弱得多:如果原文很短或很常见,攻击者只要把几十亿个候选逐一算出哈希再来查表就行。密码库泄露后被批量破解,靠的正是这一招。对可预测的输入来说,不加盐的哈希算不上秘密。

为什么别的工具算同一个文件,结果不一样?

几乎都是换行符的差别。文本文件在 Windows 上存成 CRLF,在 Unix 上是 LF,字节不同,哈希自然不同。跨系统粘贴文本再比对哈希时,先确认换行符,别急着怀疑工具算错。只要输入的字节完全一致,哈希一定一致。

可以用 SHA-256 存密码吗?

不行。SHA-256 的设计目标就是快,而这恰恰是密码存储最不该要的特性——它让攻击者能在 GPU 上每秒尝试几十亿次。密码需要的是刻意放慢、且加盐的算法:bcrypt、scrypt 或 Argon2。SHA-256 用来保证完整性,不要用来存凭据。