一、SHA-256 的基本参数
- 输出 256 位,写成 64 位十六进制。
- 属于 SHA-2 家族(还有 SHA-224/384/512),由 NSA 设计、NIST 标准化。
- 目前没有实用碰撞攻击,被视为安全(但不等于能拿来存密码,见下文)。
SHA256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
二、和 MD5、SHA-1 的对比
| 算法 | 输出长度 | 现状 |
|---|---|---|
| MD5 | 128 位 | 碰撞已实用化,不可用于安全场景 |
| SHA-1 | 160 位 | 2017 年 SHAttered 实际碰撞,Git 正在迁移 |
| SHA-256 | 256 位 | 目前安全,通用首选 |
| SHA-512 | 512 位 | 更慢,64 位平台性能反而不错 |
SHA-1 的碰撞案例很直观:两个内容不同、SHA-1 相同的 PDF 被公开构造出来。这也是 Git 推出 SHA-256 仓库格式的原因。
三、校验下载文件的完整流程
- 从官网下载安装包,同时拿到官方公布的 SHA-256 值(通常在
SHA256SUMS文件或发布页)。 - 本地计算实际摘要。
- 比对,完全一致才安装。
# Linux
sha256sum package.tar.gz
# macOS(系统自带 shasum)
shasum -a 256 package.tar.gz
# Windows PowerShell
Get-FileHash .\package.zip -Algorithm SHA256
如果有 SHA256SUMS 文件,可以自动校验整批:
sha256sum -c SHA256SUMS
# package.tar.gz: OK
注意:校验值必须来自与文件不同的渠道,且最好走 HTTPS。如果哈希值和安装包放在同一台被攻破的服务器上,攻击者可以同时替换两者,校验就失去意义。
四、哈希相同就等于安全吗
不等于。它只能证明「内容和官方公布摘要时一致」,前提是那串摘要是可信的。攻击链上还有几个缺口:
- 官方页面本身被篡改(摘要和文件一起换)。
- 分发被劫持但你没走 HTTPS。
- 摘要只校验了外层压缩包,解压后仍可能带恶意脚本。
所以哈希校验是「必要条件」而非「充分条件」,配合代码签名(Windows Authenticode、macOS 公证)才完整。
五、不要用它存密码
SHA-256 是快速哈希,反查表能覆盖绝大多数弱密码。存密码必须用慢哈希 + 盐:bcrypt、scrypt、Argon2id。加盐只能防「彩虹表批量匹配」,防不住「针对单个用户的暴力破解」,关键还是慢。
需要「带密钥的摘要」时用 HMAC-SHA256,而不是 sha256(key + msg)——后者存在长度扩展攻击风险,详见 HMAC 是什么。
六、几个使用细节
- 大小写:摘要通常小写输出,比对前统一转小写,别因为大小写误判。
- 换行与空格:文本哈希把换行也算进内容,从网页复制时多一个换行结果就完全不同。
- 大文件:浏览器算几百 MB 文件会卡,用命令行或流式处理。
- 二进制模式:Windows 上文本模式会做 CRLF 转换,算出来的值可能和 Linux 不一致,务必用二进制模式读。
日常算文本摘要用 SHA 计算,校验下载文件用 文件哈希校验(本地读取,文件不上传)。
小结
SHA-256 = 256 位、当前安全、通用校验首选;校验必须用独立渠道拿到的摘要;它不能替代密码哈希;带密钥的场景用 HMAC 而不是简单拼接。