想象一下,你可以将任何数据——一个单词、一部小说、一个4GB的视频——压缩成一段短小的、固定长度的字符串,这段字符串可以唯一标识它。改变原始数据中的一个逗号,字符串就会完全不同。而且没有办法逆转这个过程来恢复原始数据。
这正是加密哈希函数所做的事情。它是现代安全最基本的构建模块之一,默默地保护着你在网上所做的几乎一切。
指纹比喻
哈希就像数字指纹一样工作。你的指纹唯一标识你,但没有人能从指纹重建你的面容。同样,加密哈希唯一标识一段数据,但不会泄露数据的内容。
将任何输入送入哈希函数,你会得到一个摘要(也称为哈希值或校验和)——一段固定长度的十六进制字符串。SHA-256是最常用的算法之一,无论输入大小,始终产生64个字符的输出。
| 输入 | SHA-256摘要(前16个字符) |
|---|---|
Hello |
185f8db32271fe25... |
hello |
2cf24dba5fb0a30e... |
| 整个维基百科的转储 | (仍然是64个字符) |
四个本质属性
一个函数要被认定为加密哈希,必须满足以下属性:
- 确定性。 相同的输入始终产生相同的输出,在任何机器上、任何时间。
- 单向性(原像抗性)。 给定一个哈希值,在计算上不可能找到原始输入。你无法"反哈希"数据。
- 抗碰撞性。 几乎不可能找到两个产生相同摘要的不同输入。对于SHA-256,偶然碰撞的概率约为2^128分之一——这个数字比可观测宇宙中的原子数还大。
- 雪崩效应。 改变输入中的一个比特,大约一半的输出比特会翻转。相似输入之间没有可检测的模式或关系。
关键区别: 哈希不是加密。加密可以用密钥逆转;哈希是故意不可逆的。你加密数据是为了在传输过程中保护它。你哈希数据是为了验证其完整性或存储证明而不保留原始数据。
常见哈希算法
MD5(1991年)
- 输出: 128位(32个十六进制字符)
- 状态: 已被密码学攻破。研究人员可以在笔记本电脑上几秒钟内生成碰撞。
- 仍在使用: 文件下载的非安全校验和和遗留系统。
SHA-1(1995年)
- 输出: 160位(40个十六进制字符)
- 状态: 已弃用于安全用途。Google在2017年展示了实际碰撞("SHAttered"攻击)。
- 仍在使用: 旧的Git仓库,一些遗留证书。
SHA-256(2001年)
- 输出: 256位(64个十六进制字符)
- 状态: 当前标准。无已知实际攻击。
- 使用: TLS证书、Bitcoin、密码哈希、数字签名、文件完整性验证。
SHA-3(2015年)
- 输出: 可变(通常256位)
- 状态: 最新标准,基于与SHA-2系列完全不同的内部设计(Keccak海绵结构)。
- 使用: 面向未来的系统、Ethereum、需要算法多样性的场合。
| 算法 | 输出大小 | 安全? | 速度 |
|---|---|---|---|
| MD5 | 128位 | 否 | 非常快 |
| SHA-1 | 160位 | 否 | 快 |
| SHA-256 | 256位 | 是 | 中等 |
| SHA-3-256 | 256位 | 是 | 中等 |
加密哈希的用途
密码存储
当你创建账户时,设计良好的系统绝不会以明文存储你的密码。它存储的是哈希值。登录时,系统将你输入的内容进行哈希计算,并与存储的值进行比较。即使数据库被入侵,攻击者得到的是哈希——而不是密码。
现代系统更进一步,添加随机盐值(哈希前追加的额外数据),并使用bcrypt、scrypt或Argon2等故意缓慢的算法,使暴力猜测变得不现实。
文件完整性验证
软件发布者会在下载文件旁边公布SHA-256校验和。下载后,你在自己的机器上计算文件的哈希并进行比较。匹配证明文件在传输过程中未被损坏或篡改。
数字签名
当你对文档进行数字签名时,系统首先对文档进行哈希计算,然后用你的私钥加密哈希值。接收者用你的公钥解密,并与他们自己计算的文档哈希进行比较。这比加密整个文档效率高得多,同时证明了作者身份和完整性。
区块链
区块链中的每个区块都包含前一个区块的哈希,形成不可篡改的链。修改任何过去的交易会改变该区块的哈希,从该点起打断链条,使篡改立即可见。
为什么MD5和SHA-1被认为是被攻破的
当有人能够故意创建两个产生相同哈希的不同输入(即碰撞)时,该哈希算法就被认为是"被攻破的"。这破坏了所有依赖唯一性的使用场景。
- MD5: 碰撞可以在几秒内生成。研究人员已经创建了具有相同MD5哈希的两个不同的PDF文件。
- SHA-1: 2017年的SHAttered攻击生成了具有相同SHA-1哈希的两个不同的PDF,需要大约6,500年的单CPU计算(使用云资源可行)。
实用规则: 在任何与安全相关的用途中——密码、证书、数字签名或涉及对手的完整性检查——绝不要使用MD5或SHA-1。请改用SHA-256或SHA-3。
深入了解
哈希是那种一旦你亲自实验就能直观理解的概念之一。试着哈希一个句子,然后改变一个字符,亲眼观察雪崩效应。
