SHA-256 哈希生成器

在浏览器中通过 Web Crypto API 计算文本、十六进制字节或任意文件的 SHA-256 摘要。把官方公布的校验值粘贴到“对比”框,即可验证下载的文件。

全部算法

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

使用方法

  1. 输入或粘贴文本,切换为十六进制字节输入,或打开要校验的文件。
  2. 保持 SHA-256 算法,选择小写十六进制、大写十六进制或 Base64 输出。
  3. 把下载页面上的校验值粘贴到“对比”框,显示“一致”即说明文件完全相同。
  4. 复制结果,或在“全部算法”表格中复制 SHA-384、SHA-512 等其他摘要。

什么是 SHA-256?

SHA-256 是 SHA-2 家族中使用最广泛的成员,由 NSA 设计,NIST 于 2002 年在 FIPS 180-2 中将其标准化。现行规范是 FIPS 180-4,RFC 6234 则给出了同一组算法的参考代码。SHA-256 以 512 位为一块,经过 64 轮 32 位运算,输出 256 位摘要,即 64 个十六进制字符或 44 个 Base64 字符。目前没有已知的实用碰撞攻击或原像攻击,它是以下场景的默认选择:

  • TLS 证书与握手,以及代码签名;
  • 比特币:区块哈希、工作量证明和交易 ID 都使用两次 SHA-256(Base58Check 地址中的校验和也来自这一双重哈希);
  • SHA256SUMS 等校验文件、容器镜像摘要(sha256:...)以及子资源完整性(SRI)。

校验下载的文件

打开下载好的文件,把发布者提供的校验值粘贴到“对比”框。字母大小写无关紧要,Base64 形式的值也可以。显示“一致”说明文件与生成校验值时的文件逐字节相同,但这并不能证明文件出自谁手,所以校验值应取自发布者的 HTTPS 网站或经过签名的 SHA256SUMS 文件,而不是提供下载的那个镜像站。

对文本而言,哈希针对的是字节而不是字符。Windows 换行符(CRLF)、字节顺序标记(BOM),或者用 UTF-16 代替 UTF-8,都会得到完全不同的 SHA-256。可以通过“文本编码”或十六进制输入,准确还原其他系统所哈希的字节。

长度扩展攻击与密码存储

与 MD5、SHA-1 和 SHA-512 一样,SHA-256 存在长度扩展问题:已知 SHA-256(secret + message) 和密钥的长度,攻击者无需知道密钥本身,就能为原消息加上填充和任意追加数据后的内容算出有效的哈希。需要用密钥签名或认证数据时,请使用 HMAC 生成器中的 HMAC-SHA256,而不是把密钥和消息拼在一起哈希。

正因为速度快,直接用 SHA-256 存储密码并不合适:拿到哈希的人可以用显卡全速尝试猜测,而且相同的密码会得到相同的哈希。请使用 Argon2id、scrypt、bcrypt,或迭代次数足够高的 PBKDF2-HMAC-SHA256,它们都会加盐。

在命令行和代码中计算 SHA-256

$ printf 'abc' | sha256sum
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad  -

sha256sum -c SHA256SUMS                  # Linux:校验列表中的所有文件
shasum -a 256 file.iso                   # macOS
certutil -hashfile file.iso SHA256       # Windows
Get-FileHash file.iso                    # PowerShell(默认算法即 SHA256)

# Python
hashlib.sha256(data).hexdigest()

// Node.js
crypto.createHash('sha256').update(data).digest('hex')

abc 的结果是标准中的测试向量,在上方输入 abc 即可看到相同的值。“全部算法”表格还会列出你输入内容的 SHA-384、SHA-512、SHA-1、MD5 和 CRC 值。

编码示例

输入 (UTF-8)SHA-256
Hello, World!dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
Base64.is63f2f446bc11a1f96175c0f77bdac08ca1b184ba42c3a42c34ddcbce00b1b800
你好670d9743542cae3ea7ebe36af56bd53648b0a1126162e78d81a32934a711302e

常见问题

SHA-256 可以解密吗?

不能。SHA-256 是单向哈希,不是加密。网上的“解密”工具只是在已知输入的哈希表里查找,能查到常见密码和短字符串,却查不到任何较长或随机的内容。

为什么我算出的 SHA-256 与官方公布的不一致?

最常见的原因是下载不完整或版本不同,或者哈希的是文件名而不是文件本身。请用“打开文件”加载文件。另外要确认两者是同一种算法:128 个字符的十六进制值来自 SHA-512 等 512 位哈希,而不是 SHA-256。

如何得到 Base64 格式的 SHA-256?
把输出格式设为 Base64。子资源完整性(sha256- 开头的值,不过 sha384- 更常见)和 HTTP Content-Digest 头使用的都是这种格式。十六进制和 Base64 表示的是同样的 32 个字节,可以用 Base64 转十六进制互相转换。
SHA-256 和 SHA-2 是一回事吗?

SHA-2 是一个家族,包括 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256,SHA-256 是其中最常用的一个。SHA-3(FIPS 202)则是基于 Keccak 的另一套设计,结果完全不同。

SHA-256 值有多长?
32 字节:十六进制为 64 个字符,Base64 为 44 个字符,并以 = 结尾。SHA3-256 和 BLAKE2s 的长度相同,遇到未知哈希时可以用哈希识别工具列出可能的算法。