如何得到 Base64 格式的 SHA-256 哈希
- 算法 下已选中 SHA-256;其他按钮可切换为 MD5、SHA-1、SHA-384 或 SHA-512。
- 输入 设为 文本 时,在 文本 框中输入或粘贴内容。输入格式 决定如何读取这段文本:作为 UTF-8 文本,或者在你想对已编码的二进制数据计算哈希时,作为 hex 或 Base64 字节。
- 以 Hex、Base64 或 Base64URL 形式复制结果。所有算法 会列出同一输入的所有摘要。
- 要计算文件的哈希,把 输入 切换为 文件,拖入一个或多个文件。每个文件都有单独的结果。超过 200 MB 时,SHA-256 和 MD5 会按 8 MB 分块计算并显示进度,大文件永远不需要一次性全部载入内存。
哈希会随输入实时更新。顶部的 HMAC 和 SRI 可以切换到带密钥的哈希和子资源完整性(Subresource Integrity)标签。
哈希示例
| 输入 | SHA-256(hex) | SHA-256(Base64) |
|---|---|---|
| 空字符串 | e3b0c442…7852b855 | 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= |
hello | 2cf24dba…938b9824 | LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= |
hello + 换行符 | 5891b5b5…46f6be03 | WJG1tSLV3whtD/CxEPvZ0hu0/HFjrzTQgoai6Eb2vgM= |
The quick brown fox jumps over the lazy dog | d7a8fbb3…37c9e592 | 16j7swfXgJRpypq8sAguT41WUeRtPNt2LQLQvzfJ5ZI= |
第二行和第三行就是大多数哈希不一致背后的陷阱:一个看不见的换行符就会得到完全不同的哈希。粘贴到浏览器文本框中的文本,换行也会被转换为 LF,所以对于使用 CRLF 换行的文件,请直接拖入文件本身,不要粘贴它的内容。
哪些地方会用到 Base64 格式的 SHA-256
打印摘要的传统方式是 hex,但很多格式因为更短而使用 Base64:
- 内容安全策略(CSP)哈希,用于内联脚本:
script-src 'sha256-…'。 - 子资源完整性(SRI):
integrity="sha256-…",不过那里更常用的是 SHA-384。 - HTTP
Content-Digest(RFC 9530):对于正文{"hello": "world"},是Content-Digest: sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:。冒号在结构化请求头中表示二进制值。 - 云存储校验和,比如 Amazon S3 的
x-amz-checksum-sha256请求头,携带的就是 Base64 摘要。 - 锁文件和包管理器:
package-lock.json中的integrity字段(通常是sha512-…),以及 Nix 中 SRI 风格的哈希。
Docker 和 OCI 镜像摘要(sha256:…)以及 Git 使用 hex。需要跨系统比较时,用 Hex 转 Base64 或 Base64 转 Hex 转换即可,不必重新计算哈希。
在代码和命令行中输出 SHA-256 Base64
printf 'hello' | openssl dgst -sha256 -binary | base64
sha256sum file.bin | cut -d' ' -f1 | xxd -r -p | base64
不加 -binary 时,OpenSSL 会输出 hex 文本,而对这段文本做 Base64 会得到 88 个毫无意义的字符。
import base64, hashlib
digest = hashlib.sha256(b"hello").digest()
print(base64.b64encode(digest).decode())
在 Node.js 中,crypto.createHash("sha256").update("hello").digest("base64") 返回同样的 LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=,改用 "base64url" 则得到 URL 安全形式。普通哈希不是签名:任何人都能重新算出来。要证明消息来自持有密钥的人,请使用 HMAC。更多内容见 Python 中的 Base64 和 OpenSSL。
常见问题
为什么我的 SHA-256 和命令行算出来的不一样?
几乎都是末尾换行符的问题。echo hello 输出 6 个字节,即 hello 加 \n,所以它的哈希与 hello 的哈希不同。在 shell 中请用 printf 'hello' 或 echo -n hello,或者直接把文件拖到这里比较。
SHA-256 哈希的 Base64 有多长?
44 个字符,以一个 = 结尾;不带填充的 Base64URL 是 43 个字符。hex 形式是 64 个字符。如果你得到的是 88 个字符,说明被 Base64 编码的是 hex 文本,而不是原始摘要。
能把 SHA-256 的 hex 字符串转成 Base64 吗?
可以,摘要的字节是一样的。把 64 个 hex 字符粘贴到 Hex 转 Base64,或者在 shell 中对 hex 运行 xxd -r -p,再通过管道传给 base64。
SHA-256 能解密回原文吗?
不能。哈希是单向的指纹,没有什么可以解码的。解码 Base64 只能得到那 32 个摘要字节;它和编码有什么区别,见 Base64 不是加密。