使用方法
- 输入文本、切换为十六进制字节输入,或打开文件。
- 算法默认为 SHA-1,如需对照其他哈希函数,可在“算法”中切换。
- 选择小写十六进制(与 sha1sum 和 Git 的输出一致)、大写十六进制或 Base64。
- 把预期的 SHA-1 粘贴到“对比”框,页面会显示“一致”或“不一致”。
什么是 SHA-1?
SHA-1(Secure Hash Algorithm 1)由美国国家安全局(NSA)设计,NIST 于 1995 年在 FIPS 180-1 中发布,取代了很快被撤回的 SHA-0。现行规范是 FIPS 180-4,RFC 3174 还附有 C 语言示例代码。SHA-1 以 512 位为一块、经过 80 轮运算,输出 160 位摘要,即 40 个十六进制字符或 28 个 Base64 字符。
和所有哈希一样,SHA-1 是单向的:摘要无法解密,只能通过逐个计算猜测值的哈希来匹配。2012 年 LinkedIn 泄露的未加盐 SHA-1 密码哈希就是这样被大批破解的。存储密码应当使用 Argon2、scrypt、bcrypt 或 PBKDF2。
SHAttered:SHA-1 为何被弃用
2017 年 2 月,荷兰 CWI 与 Google 的研究人员公布了 SHAttered 攻击,首次给出真实的 SHA-1 碰撞:两个内容不同的 PDF 文件拥有相同的哈希值,计算量约为 2^63 次 SHA-1 运算。2020 年,Gaëtan Leurent 和 Thomas Peyrin 在论文《SHA-1 is a Shambles》中利用选择前缀碰撞,演示了伪造 PGP 密钥上的 SHA-1 签名,所需成本已在资金充足的攻击者承受范围之内。
- 公共 CA 自 2016 年起停止签发 SHA-1 TLS 证书,主流浏览器在 2017 年初不再信任此类证书。
- NIST 自 2013 年起禁止用 SHA-1 生成新的数字签名,并计划在 2030 年底前全面淘汰 SHA-1。
- 大多数 Git 仓库仍用 SHA-1 标识对象,计算时采用能检测碰撞攻击的加固实现;Git 也已支持创建使用 SHA-256 的仓库。
碰撞攻击并不能攻破 HMAC,因此 TOTP 动态码和一些旧版 Webhook 签名仍在使用 HMAC-SHA1,可以用 HMAC 生成器计算。新项目请选择 SHA-256。
Git 对象 ID、Base64 与文本编码
Git 的 blob ID 并不是文件本身的 SHA-1。Git 会先写入一个头部(blob、一个空格、以字节计的大小和一个零字节),再接上文件内容一起计算。要在本页复现,把输入切换为十六进制,并连同这些头部字节一起填入即可:以 hello 加一个换行符为例,十六进制输入为 626c6f6220360068656c6c6f0a。
$ printf 'hello\n' | sha1sum
f572d396fae9206628714fb2ce00f72e94f2258f -
$ printf 'hello\n' | git hash-object --stdin
ce013625030ba8dba906f756967f9e9ca394464a
SHA-1 一般以小写十六进制表示。Base64 形式则出现在 WebSocket 握手中(Sec-WebSocket-Accept 是客户端密钥加上固定 GUID 后的 SHA-1 的 Base64),以及 LDAP 的 {SHA} 密码格式中。还要记住,哈希针对的是字节:含有带重音字母的文本,用 UTF-8 和 Windows-1252 编码会得到不同的 SHA-1。
在命令行和代码中计算 SHA-1
sha1sum file.zip # Linux
shasum file.zip # macOS(默认算法即 SHA-1)
certutil -hashfile file.zip SHA1 # Windows
Get-FileHash file.zip -Algorithm SHA1 # PowerShell
# Python
hashlib.sha1(data).hexdigest()
// Node.js
crypto.createHash('sha1').update(data).digest('hex')
本页使用浏览器内置的 Web Crypto API 计算 SHA-1,输入内容不会离开你的设备。“全部算法”表格还会列出同一输入的 MD5、SHA-256、SHA-384、SHA-512 和 CRC 校验值。
编码示例
| 输入 (UTF-8) | SHA-1 |
|---|---|
Hello, World! | 0a0a9f2a6772942557ab5355d76af442f8f65e01 |
Base64.is | 6c667ee2efd2020349eed40efa07c26683f613c8 |
你好 | 440ee0853ad1e99f962b63e459ef992d7c211722 |
常见问题
SHA-1 现在还安全吗?
在攻击者能够选择或影响输入的场景(如签名和证书)中不安全,因为 SHA-1 碰撞已经可以人为构造。它仍可用于检测意外损坏,HMAC-SHA1 也不受碰撞攻击影响。新项目请使用 SHA-256 或 SHA-512。
SHA-1 可以反向解密吗?
不能。SHA-1 没有密钥,也不存在解密过程。查询网站只能找到已收录在常用词和泄露密码表中的输入,所以长而随机的内容查不到,简短的密码却很容易被查出。
SHA-1 值有多长?
= 结尾。RIPEMD-160 的长度与它相同,MySQL 4.1 及以上版本的密码哈希则是一个星号加 40 个十六进制字符。哈希识别工具可以列出某个字符串可能对应的算法。如何用公布的 SHA-1 校验文件?
打开文件,然后把公布的值粘贴到“对比”框。大小写十六进制和 Base64 都能识别,页面会显示“一致”或“不一致”。
SHA-1 和 SHA-256 有什么区别?
两者都由 NIST 发布,但 SHA-256 属于更新的 SHA-2 家族,输出 256 位,目前没有已知的实用攻击;SHA-1 的输出更短,抗碰撞性也已被攻破。