使用方法
- 输入或粘贴文本,切换为十六进制字节输入,或打开要校验的文件。
- 保持 SHA-256 算法,选择小写十六进制、大写十六进制或 Base64 输出。
- 把下载页面上的校验值粘贴到“对比”框,显示“一致”即说明文件完全相同。
- 复制结果,或在“全部算法”表格中复制 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.is | 63f2f446bc11a1f96175c0f77bdac08ca1b184ba42c3a42c34ddcbce00b1b800 |
你好 | 670d9743542cae3ea7ebe36af56bd53648b0a1126162e78d81a32934a711302e |
常见问题
SHA-256 可以解密吗?
不能。SHA-256 是单向哈希,不是加密。网上的“解密”工具只是在已知输入的哈希表里查找,能查到常见密码和短字符串,却查不到任何较长或随机的内容。
为什么我算出的 SHA-256 与官方公布的不一致?
最常见的原因是下载不完整或版本不同,或者哈希的是文件名而不是文件本身。请用“打开文件”加载文件。另外要确认两者是同一种算法:128 个字符的十六进制值来自 SHA-512 等 512 位哈希,而不是 SHA-256。
如何得到 Base64 格式的 SHA-256?
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 值有多长?
= 结尾。SHA3-256 和 BLAKE2s 的长度相同,遇到未知哈希时可以用哈希识别工具列出可能的算法。