如何得到 Base64 形式的 MD5 哈希
- 算法 中已预选 MD5。
- 处理文件时,把 输入 切换为 文件 并拖入文件,也可以一次拖入多个,每个文件单独出结果。超过 200 MB 的文件会以 8 MB 分块读取,并显示进度百分比。
- 处理文本时,输入 保持为 文本,直接输入或粘贴。输入格式 可以让你把 hex 或 Base64 数据当作原始字节计算哈希,而不是当作 UTF-8 文本。
- 用于请求头和 API 时复制 Base64 值,与
md5sum的输出对比时复制 Hex。两者描述的是同样的 16 个字节。
工具会简短提示 MD5 不适合用于安全用途。这个提示是对的,但不影响校验和的计算。
Hex 还是 Base64:同样的 16 个字节
| 输入 | MD5(hex) | MD5(Base64) |
|---|---|---|
| 空 | d41d8cd98f00b204e9800998ecf8427e | 1B2M2Y8AsgTpgAmY7PhCfg== |
hello | 5d41402abc4b2a76b9719d911017c592 | XUFAKrxLKna5cZ2REBfFkg== |
The quick brown fox jumps over the lazy dog | 9e107d9d372bb6826bd81d3542a419d6 | nhB9nTcrtoJr2B01QqQZ1g== |
使用 Content-MD5 时最常见的错误,是对 hex 文本做 Base64 编码。对于狐狸那句话,这样会得到 OWUxMDdkOWQzNzJiYjY4MjZiZDgxZDM1NDJhNDE5ZDY=,44 个字符,没有哪个服务器会接受。看长度就一目了然:24 个字符是对的,44 个说明错把 hex 编码了。
哪些地方需要 Base64 MD5
Content-MD5请求头(RFC 1864)。Amazon S3 会在上传时检查它,Azure Blob Storage 也会,请求体不匹配时返回错误。- Google Cloud Storage 以 Base64 报告对象的
md5Hash,gsutil hash也打印 Base64,除非传入-h改为 hex。 - Azure Blob 属性 同样以 Base64 存储
Content-MD5。 - 较老的 API 和邮件系统,它们在基于 SHA 的校验和出现之前就采用了这个请求头。
其他地方仍然使用 hex:md5sum 和大多数下载页面,以及单段上传的 S3 对象的 ETag,它就是带引号的 hex MD5。分段上传的 S3 ETag 以 - 加分段数结尾,根本不是整个文件的 MD5,所以永远不会与本工具的结果一致。
在命令行和代码中把 MD5 转为 Base64
openssl md5 -binary file.bin | base64
md5sum file.bin | cut -d' ' -f1 | xxd -r -p | base64
import base64, hashlib
with open("file.bin", "rb") as f:
digest = hashlib.file_digest(f, "md5").digest()
print(base64.b64encode(digest).decode())
hashlib.file_digest 需要 Python 3.11 或更高版本;更早的版本请分块读取文件并调用 update()。在 Node.js 中,crypto.createHash("md5").update(buffer).digest("base64") 直接给出 Base64 形式。如果较新的 API 提供 SHA-256 校验和,请优先使用它;SHA-256 转 Base64 以同样的方式生成这些值。更多代码片段见 OpenSSL 和 Python 页面。
常见问题
Content-MD5 请求头是什么?
RFC 1864 定义的一个 HTTP 请求头,内容是请求体 16 字节 MD5 摘要的 Base64。Amazon S3 和 Azure Blob Storage 等存储服务用它来拒绝传输过程中损坏的上传。
为什么我的 Base64 MD5 有 44 个字符?
你编码的是 32 字符的 hex 字符串,而不是 16 个原始字节。正确的 Base64 MD5 总是 24 个字符,并以 == 结尾。编码前请以二进制形式输出哈希(OpenSSL 用 -binary,Python 用 .digest())。
怎样把 MD5 的 hex 校验和转为 Base64?
把 hex 解码为字节,再做 Base64 编码:9e107d9d372bb6826bd81d3542a419d6 会变成 nhB9nTcrtoJr2B01QqQZ1g==。Hex 转 Base64 转换器粘贴一次即可完成。
MD5 现在还安全吗?
用来发现意外损坏,没问题。用在攻击者可能干预的任何地方,不行:一台笔记本电脑就能制造 MD5 碰撞,两个不同的文件可以有相同的哈希。防篡改的完整性校验请用 SHA-256,密码请用 Argon2 或 bcrypt 等密码哈希。