SHA 哈希计算
SHA-1 / SHA-256 / SHA-384 / SHA-512 一键计算
SHA 家族对比:SHA-1、SHA-256、SHA-512 该用哪个
SHA 家族一览
SHA 是 NIST 发布的一系列密码学哈希函数。当前实际会用到的是 SHA-2 家族,以及正在被逐步采纳的 SHA-3。
| 算法 | 输出 | 十六进制长度 | 状态 |
|---|---|---|---|
| SHA-1 | 160 位 | 40 字符 | 已不安全,禁止用于新用途 |
| SHA-224 | 224 位 | 56 字符 | 安全,用途有限 |
| SHA-256 | 256 位 | 64 字符 | 安全,通用首选 |
| SHA-384 | 384 位 | 96 字符 | 安全,常用于 TLS 证书 |
| SHA-512 | 512 位 | 128 字符 | 安全,需要更长输出时 |
| SHA3-256 | 256 位 | 64 字符 | 安全,结构不同于 SHA-2 |
SHA-256 是绝大多数场景的正确默认值。它的设计、实现库、硬件加速支持都最成熟,兼容性最好。
SHA-1 为什么不能用
2017 年的 SHAttered 项目公开了第一个 SHA-1 实际碰撞:两段内容不同的 PDF 拥有相同的 SHA-1。成本约 11 万美元的 GPU 算力,之后还在继续下降。Google、Microsoft、Mozilla 已联合弃用 SHA-1 证书,主流浏览器会直接拒绝对 SHA-1 签名的证书建立连接。
和 MD5 一样,SHA-1 的问题也是抗碰撞性被破坏,而不是"不能算很多位"。所以它仍能算,只是不能再用来证明"两份内容不同"。
SHA-256 出现在哪些地方
- TLS 证书签名。你访问的每个 HTTPS 站点背后都有一串 SHA-256。
- Git 对象标识。每个 commit、tree、blob 的哈希都是 SHA-1(新版本可迁移到 SHA-256),这是内容寻址的基础。
- 软件包完整性。npm、Maven、Docker 镜像层都用它做校验和。Docker 镜像 ID 本身就是一个 SHA-256 前缀。
- 子资源完整性(SRI)。网页里
<script integrity="sha384-...">让浏览器在加载外部脚本前先验哈希,被篡改就拒绝执行。 - 区块链。比特币的工作量证明反复计算 SHA-256(并且是双次)。
哈希不能替代的东西
不能用裸哈希做完整性认证。如果攻击者能同时修改内容和哈希值(比如同时改文件和页面上的校验码),校验就没有意义。要防篡改,必须用带密钥的 HMAC,或者数字签名,或者把哈希放到攻击者改不到的地方(HTTPS 站点、已签名的发布渠道)。
不能用哈希存密码。SHA-256 很快,快就是缺点——GPU 每秒能算几十亿次。密码哈希需要的是"慢",用 bcrypt、scrypt 或 Argon2 这类可调成本的算法,并且每个账户用独立的随机盐。
哈希不可逆,这是特性不是缺陷,但也意味着它不能用来保护需要还原的数据。加密是可逆的,哈希不是。
怎么用这个工具
粘贴文本即可得到 SHA-1 / SHA-256 / SHA-384 / SHA-512 的结果。计算用浏览器内置的 Web Crypto API,全程本地执行,输入内容不会发送到任何服务器。对于超大文件(GB 级),浏览器 API 需要一次性读入内存,建议改用命令行工具如 sha256sum 流式计算。
验证下载文件时,注意逐字符比对:长度不对就不是同一个哈希,不用细看内容。工具支持大小写切换,因为有些发布方给的是大写。
常见问题
SHA-256 和 MD5 该用哪个?
校验完整性用 SHA-256;MD5 和 SHA-1 都已存在碰撞攻击,不适合安全场景。
为什么提示"当前环境不支持"?
WebCrypto 的摘要接口只在 HTTPS 或 localhost 下可用,部署到线上就没问题。