SHA-1 哈希生成器

随输入实时计算文本、十六进制字节或文件的 160 位 SHA-1 摘要,可与公布的校验值对比,并一并查看同一输入的 SHA-256、SHA-512 和 MD5。

全部算法

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 输入文本、切换为十六进制字节输入,或打开文件。
  2. 算法默认为 SHA-1,如需对照其他哈希函数,可在“算法”中切换。
  3. 选择小写十六进制(与 sha1sum 和 Git 的输出一致)、大写十六进制或 Base64。
  4. 把预期的 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.is6c667ee2efd2020349eed40efa07c26683f613c8
你好440ee0853ad1e99f962b63e459ef992d7c211722

常见问题

SHA-1 现在还安全吗?

在攻击者能够选择或影响输入的场景(如签名和证书)中不安全,因为 SHA-1 碰撞已经可以人为构造。它仍可用于检测意外损坏,HMAC-SHA1 也不受碰撞攻击影响。新项目请使用 SHA-256 或 SHA-512。

SHA-1 可以反向解密吗?

不能。SHA-1 没有密钥,也不存在解密过程。查询网站只能找到已收录在常用词和泄露密码表中的输入,所以长而随机的内容查不到,简短的密码却很容易被查出。

SHA-1 值有多长?
160 位,即 20 字节:十六进制为 40 个字符,Base64 为 28 个字符,并以一个 = 结尾。RIPEMD-160 的长度与它相同,MySQL 4.1 及以上版本的密码哈希则是一个星号加 40 个十六进制字符。哈希识别工具可以列出某个字符串可能对应的算法。
如何用公布的 SHA-1 校验文件?

打开文件,然后把公布的值粘贴到“对比”框。大小写十六进制和 Base64 都能识别,页面会显示“一致”或“不一致”。

SHA-1 和 SHA-256 有什么区别?

两者都由 NIST 发布,但 SHA-256 属于更新的 SHA-2 家族,输出 256 位,目前没有已知的实用攻击;SHA-1 的输出更短,抗碰撞性也已被攻破。