如何生成哈希值并验证校验和
- 保持输入方式为文本并输入或粘贴内容;或者切换到文件,从设备中选择一个文件。
- MD5、SHA-1、SHA-256、SHA-384 和 SHA-512 的结果会一起显示在表格中,每行都有复制按钮。如果要粘贴的地方要求大写十六进制字母,请勾选大写。
- 要验证下载的文件,把发布者公布的校验和粘贴到验证校验和输入框。无需说明是哪种算法:匹配的那一行会变成绿色,提示信息会写出算法名称。大小写和首尾空格都会被忽略。
文件不会发送到服务器,而是由浏览器直接读取并计算哈希值。因此校验大型安装包或机密文档既不用等待上传,也不会泄露内容。不过很大的文件会被一次性读入内存,在手机上处理几 GB 的磁盘镜像可能会比较慢。
什么是哈希
密码学哈希函数可以把任何输入——一个单词、一份合同、一段 4 GB 的视频——变成固定长度的“指纹”。相同的输入总是得到相同的摘要,任何改动都会产生完全不同的结果,而且无法从摘要反推出原始输入。因此哈希不是加密:没有密钥,也没有什么可以解密。
| 算法 | 摘要长度 | 十六进制字符数 | 现状 |
|---|---|---|---|
| MD5 | 128 位 | 32 | 在安全上已被攻破;用于发现意外损坏仍然够用 |
| SHA-1 | 160 位 | 40 | 在安全上已被攻破;旧工具和 Git 中仍可见到 |
| SHA-256 | 256 位 | 64 | 当前校验和与签名的默认选择 |
| SHA-384 | 384 位 | 96 | SHA-2 系列,安全 |
| SHA-512 | 512 位 | 128 | SHA-2 系列,安全 |
根据公布的校验和长度就能判断算法:32 个十六进制字符是 MD5,64 个是 SHA-256,以此类推。
示例
hello→ SHA-2562cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824,MD55d41402abc4b2a76b9719d911017c592。- 首字母大写的
Hello→ SHA-256185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969。只改了一个字母,结果就毫不相干。 The quick brown fox jumps over the lazy dog→ MD59e107d9d372bb6826bd81d3542a419d6。在末尾加一个句点,就变成e4d909c290d0fb1ca068ffaddf22cbd0。- 空输入也有摘要:SHA-256 是
e3b0c442…b855。本页在你输入之前会让表格保持空白,但如果这个值出现在你自己的日志或数据库里,说明某处对空字符串做了哈希。
为什么和命令行的结果不一致
文本会按输入的原样以 UTF-8 字节进行哈希。结果不同,几乎总是因为看不见的字节:
- 末尾换行符。
echo hello | sha256sum会把hello加上换行符一起哈希,输出5891b5b5…6be03。要得到与本页相同的值,请使用printf %s hello或echo -n hello。 - 换行格式。在 Windows 上保存的文件以 CR LF 结束每一行,而粘贴到浏览器输入框的文本只使用 LF。校验文件时,请不要复制其内容,而是用文件模式直接对文件本身计算哈希。
- 字符编码。
café按 UTF-8 编码时 MD5 是07117fe4a1ebd544965dc19573183da2,按旧的 Latin-1 编码则是961f50f6282239d09e48f812c1ca7276。用 GBK 保存的中文文本同样会得到与 UTF-8 不同的值。
对文件计算的结果与 Linux 的 sha256sum 文件、macOS 的 shasum -a 256 文件、Windows PowerShell 的 Get-FileHash 文件(默认 SHA-256)完全一致。
MD5 和 SHA-1 不能用于安全用途
安全的哈希必须让人在实际上无法找到摘要相同的两个不同输入(碰撞)。MD5 和 SHA-1 的实际碰撞分别在 2004 年和 2017 年被公开,这意味着攻击者可以准备两个校验和相同的文件。它们仍然适合发现下载中断之类的意外损坏,但对于可能被人篡改的内容,请使用 SHA-256 或更长的算法。
这些函数都不应该用来存储密码。它们的设计目标就是快,因此泄露的密码哈希表可以用普通显卡以每秒数十亿次的速度进行猜测比对。存储密码需要专门设计的、慢速且加盐的算法,例如 Argon2id、scrypt 或 bcrypt。如果你首先需要的是一个强密码,可以试试密码生成器。
常见问题
哈希值可以解密或还原吗?
不能。号称能“解密 MD5”的网站,只是在预先计算好的常用词哈希大表中查找。对 hello 有效,对随机的 20 位字符串则无效。
给自己的文件生成校验和,应该选哪种算法?
SHA-256。它到处都支持,长度便于粘贴,也没有已知的实用攻击。请在值的旁边注明算法名称。
校验和一致就说明文件安全吗?
它证明你的文件与生成校验和的那个文件逐字节相同。如果攻击者控制了网站本身,就可以同时替换文件和校验和,所以应优先使用来自另一个可信渠道的校验和或经过签名的发布版本。
为什么页面提示“需要在安全的(https)页面中使用”?
SHA 系列算法由浏览器的 Web Crypto API 计算,而该 API 只能在安全连接下工作。MD5 由页面自己的代码计算,所以这种情况下仍会显示。