随机与安全

哈希计算与文件校验

计算任意文本或文件的 MD5、SHA-1、SHA-256、SHA-384 和 SHA-512。把下载页上公布的校验值粘贴进来,匹配的那一行会变绿,确认文件在传输中没有损坏或被替换。

MD5 · 不安全
SHA-1 · 不安全
SHA-256
SHA-384
SHA-512

全部在你的浏览器里运行,这里输入的内容不会上传。

怎么校验下载的文件

  1. 选择文件并拖入下载好的文件;或者选择文本,计算输入文字的哈希值。
  2. 五种哈希值会一起算出,大文件会显示读取进度。
  3. 把下载页上公布的校验值粘贴到期望的校验值里,大小写和空格都不影响。如果某个哈希值与之相同,那一行会变绿,并提示是哪种算法。
  4. 如果都不一致,说明这不是发布者发布的那个文件:可能下载不完整、传输中损坏,或者被人替换过。请从官方渠道重新下载。

什么是哈希值

密码学哈希函数把任意长度的数据变成一个固定长度的「指纹」。同样的输入总是得到同样的哈希值;哪怕只改一个比特,哈希值也会面目全非;对于安全的哈希算法,既无法找到两个哈希值相同的不同输入,也无法从哈希值倒推出原始数据。这正是用哈希校验下载的原理:发布者公布原始文件的哈希值,你计算收到的文件的哈希值,只有两个文件逐位完全相同,两者才会一致。

该信任哪种算法

算法长度现状
MD5128 位(32 个十六进制字符)已被攻破,可以故意构造碰撞;只适合发现意外损坏
SHA-1160 位(40 个十六进制字符)已被攻破,2017 年已有实际碰撞;不要用于安全用途
SHA-256256 位(64 个十六进制字符)安全,下载校验最常用
SHA-384384 位(96 个十六进制字符)安全
SHA-512512 位(128 个十六进制字符)安全

收录 MD5 和 SHA-1,是因为很多较老的下载页仍然只公布这两种,而且它们仍能可靠地发现意外损坏的文件。但它们防不住有人故意替换文件,因为攻击者可以构造出 MD5 或 SHA-1 相同的不同文件。发布者提供 SHA-256 时,请优先使用 SHA-256。

本页是怎么计算的

SHA 系列使用浏览器内置的 Web Crypto 接口。MD5 不在 Web Crypto 里,所以在本页按 RFC 1321 实现,并用 RFC 自带的测试值、以及在 3 MB 随机数据上与 Node.js 的结果做过核对。文本会先按 UTF-8 转成字节再计算,所以同样的中文文本,结果和 UTF-8 系统上的命令行工具一致。

哈希不等于密码存储

SHA-256 这类快速哈希不应该单独用来保存密码:它们的设计目标就是快,而这也让猜测变得很快。保存密码需要专门设计得很慢、并且加盐的算法,比如 Argon2、bcrypt 或 scrypt。

示例

输入算法哈希值
空文本MD5d41d8cd98f00b204e9800998ecf8427e
abcMD5900150983cd24fb0d6963f7d28e17f72
abcSHA-1a9993e364706816aba3e25717850c26c9cd0d89d
abcSHA-256ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

这些是 RFC 1321 和 FIPS 180-4 里的标准测试向量,可以用来确认任何哈希工具是否工作正常。命令行里的对应做法是:macOS 和 Linux 上用 shasum -a 256 文件名,Windows 上用 certutil -hashfile 文件名 SHA256。

常见用法:下载系统镜像、开发工具安装包之后,对照官网公布的 SHA-256 核对一遍,确认文件没有在镜像站或网盘转存时被篡改。

局限

  • 超过 512 MB 的文件不计算 SHA 系列。 Web Crypto 只能一次性对整个文件计算,需要把整个文件读进内存。MD5 按 4 MB 分块计算,多大的文件都行。
  • 文本按 UTF-8 计算,换行完全按输入的来。 末尾多一个换行,哈希值就不同,这是不同工具对同一段文字算出不同结果最常见的原因。
  • 不支持 HMAC 等带密钥的哈希,也不支持 SHA-3、BLAKE 系列,Web Crypto 没有提供这些算法。

常见问题

怎么用校验值验证下载的文件?

在这里计算下载文件的哈希值,把官网公布的校验值粘贴到「期望的校验值」里。出现绿色的一行,就说明文件与官方发布的完全相同。

文件会被上传吗?

不会。文件在你的浏览器里读取和计算,这也是对私密文件计算哈希唯一安全的做法。

MD5 还安全吗?

用于安全目的已经不安全。它能发现意外损坏,但攻击者可以构造出 MD5 相同的不同文件。能用 SHA-256 就用 SHA-256。

为什么两个工具对同一段文字算出的哈希不一样?

通常是因为看不见的差异,比如末尾多了换行、换行符不同,或者文字编码不同(UTF-8 与 GBK)。

哈希值能还原成原文吗?

不能,哈希是单向的指纹。但对于很短、容易猜的输入,攻击者可以逐个尝试再比对,所以密码需要专门的慢哈希。

参考资料

用到这个工具的指南

↵ 打开 · Esc 关闭