哈希是什么
密码学哈希函数接受任意大小的输入,一个词、一个文件、一个数 GB 的磁盘镜像,并产生一个称为摘要(digest)的固定大小输出。无论你喂给它一个字符还是一百万个, 始终返回 256 比特(32 字节)。相同的输入始终产生相同的摘要,而对输入哪怕一个比特的改动都会产生一个完全不同的摘要。
那个固定大小、确定性的指纹就是全部要义。摘要是数据的紧凑替身:若两个摘要相符,你可以确信输入是相同的;若它们不同,输入在某处不同。
使其成为密码学的那些性质
许多函数都能把数据缩小到固定大小。一个函数靠坚守三条硬性保证而配得上密码学这个词:
- 抗原像性(单向)。 给定一个摘要,要找到一个能产生它的输入在计算上不可行。你无法把函数倒着运行。
- 抗第二原像性与抗碰撞性。 要找到两个哈希到同一摘要的不同输入是不可行的。没有这一点,摘要将是一个脆弱的指纹。
- 雪崩效应。 翻转单个输入比特会改变大约一半的输出比特,输入与输出之间没有可见的关联模式。
这些只对经受住审查的函数成立。SHA-1 曾是标准,如今在抗碰撞性上已被攻破(2017 年演示了一次实际碰撞),不应在安全性依赖它之处使用。SHA-2 系列,SHA-256、SHA-384 和 SHA-512,依然稳健,是当今安全的默认选择。
哈希不是加密
这是最常见的混淆,因此值得直白地说明。加密凭密钥是可逆的:你加密以保守数据机密,解密以取回它。哈希没有密钥也没有逆运算。你无法把摘要“反哈希”以恢复输入,因为输出远小于可能的输入,而信息被有意销毁。哈希用于验证,而非保密。
哈希在何处发挥价值
- 完整性与校验和。 把一个文件的 SHA-256 与它一同发布;下载者重新计算摘要即可确认在传输中没有任何东西被改动或损坏。
- 内容寻址。 像 Git 这样的系统按对象的哈希为其命名,因此相同的内容会自动落到相同的地址。
- 数字签名。 签名方案签署一条消息的哈希而非整条消息,因为摘要小且大小固定。
一条重要的告诫:密码是一个特例。 像 SHA-256 这样简单的快速哈希是存储密码的错误工具,正因为它快,攻击者每秒可尝试数十亿次猜测。密码存储需要一个有意放慢、加盐的算法,例如 bcrypt、scrypt 或 Argon2。完整性用 SHA-2;密码用密码哈希。
工具如何计算它
哈希工具 使用浏览器原生的 Web Crypto 实现来计算 SHA-1、SHA-256、SHA-384 和 SHA-512,与你的浏览器用于 TLS 的是同一套经过审查的代码,并以十六进制和 Base64 显示每个摘要。不上传任何东西;计算在本地进行。