如何把 hex 转为 Base64
- 把 hex 粘贴到 输入 · Hex。空格、换行、冒号、短横线以及
0x或\x前缀都会被跳过,大小写无所谓。 - Base64 会随输入实时出现在 输出 · Base64 中。
- 在输出下方,如果接收方需要不带填充的 Base64,取消勾选 填充(=);需要换行输出时,把 换行 设为 64(PEM)或 76(MIME)。
- 按 复制输出,或用 Base64 → Hex 切换反向检查结果。Base64 转 Hex 就是同一个工具的反方向。
哈希摘要:hex 与 Base64
哈希函数返回的是原始字节。sha256sum、md5sum 等命令行工具把这些字节打印为 hex,而很多协议需要的是同一个摘要的 Base64 形式。下面是 5 个字节 hello 的摘要:
| 哈希 | Hex(来自 sha256sum 等) | Base64 |
|---|---|---|
| MD5 | 5d41402abc4b2a76b9719d911017c592 | XUFAKrxLKna5cZ2REBfFkg== |
| SHA-1 | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d | qvTGHdzF6KLavt4PO0gs2a6pQ00= |
| SHA-256 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= |
需要 Base64 形式的场合:
- 子资源完整性(SRI)。
<script>或<link>标签上的integrity="sha384-…"存放的是 Base64 摘要。SRI 哈希生成器 可以根据文件生成整个属性。 Content-MD5请求头。 RFC 1864 规定其值为 16 字节 MD5 摘要的 Base64,用它校验上传的对象存储会拒绝 hex 形式。参见 Base64 形式的 MD5。- API 请求中的签名和 HMAC,通常以 Base64 发送。Base64 形式的 HMAC 可以按两种形式计算。
- 密钥和机密:
openssl rand -hex 32打印的 32 字节密钥,会变成很多配置文件需要的 44 字符 Base64 值。
要计算你自己的文本或文件的 SHA-256,Base64 形式的 SHA-256 可以完全跳过 hex 这一步。
常见错误:把 hex 文本拿去编码
echo -n 2cf24d…9824 | base64 给出的结果看似合理,实则是错的。它编码的是 hex 的 64 个 ASCII 字符,而不是它们所代表的 32 个字节,结果是以 MmNmMjRk 开头的 88 个字符。这个值解码后又回到 hex 文本,所以在签名或完整性校验失败之前,不会有任何报错。请先解码 hex:
echo -n 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | xxd -r -p | base64
# LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
printf hello | openssl dgst -sha256 -binary | base64
# same result, without going through hex at all
xxd -r -p 把纯 hex 还原为字节。它随 Vim 一起提供;在精简系统上请安装 xxd 包。使用 OpenSSL 时,正是 -binary 让摘要以字节而不是 hex 输出。
在代码中把 hex 转为 Base64
import base64
base64.b64encode(bytes.fromhex("5d41402abc4b2a76b9719d911017c592")).decode()
# 'XUFAKrxLKna5cZ2REBfFkg=='
Buffer.from("5d41402abc4b2a76b9719d911017c592", "hex").toString("base64");
// 'XUFAKrxLKna5cZ2REBfFkg=='
Python 和 Node.js 页面介绍了 URL 安全和不填充的变体。如果摘要要放进 URL 或 JWT,请用 Base64 转 Base64URL 转换结果。
转换失败时
- “十六进制数字个数为奇数”。 每个字节需要两位数字,复制时丢了一位。检查输入的开头和结尾。
- “出现意外字符”。 输入中有不是 hex 的内容,例如
sha256:标签,或sha256sum在摘要后面打印的文件名。把它删掉;显示 会跳到出错的位置。 - hex 转储中的偏移量。 在
00000010: 4865 6c6c中,00000010是位置而不是数据,但它是有效的 hex,会被一起转换。请使用不带偏移量的xxd -p输出。
常见问题
怎样把 SHA-256 的十六进制哈希转为 Base64?
把 64 位十六进制数字粘贴到输入框。结果是以 = 结尾的 44 个字符,例如 2cf24dba…9824 会变成 LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=。命令行中:echo -n HEX | xxd -r -p | base64。
为什么我的 Base64 比预期长一倍?
hex 字符串被当成文本编码了,每个十六进制数字都变成了一个字节。这样处理 SHA-256 摘要会得到 88 个字符,而不是 44 个。应该先把 hex 解码成字节,这正是本转换器的做法。
一个 hex 字符串会得到多少个 Base64 字符?
两位十六进制数字是一个字节,每 3 个字节变成 4 个 Base64 字符,并向上取整到 4 的倍数。32 位 hex(MD5)得到 24 个字符,40 位(SHA-1)得到 28 个,64 位(SHA-256)得到 44 个,128 位(SHA-512)得到 88 个。
可以把 UUID 转为 Base64 吗?
可以,连同短横线一起粘贴即可。123e4567-e89b-12d3-a456-426614174000 的 16 个字节会变成 Ej5FZ+ibEtOkVkJmFBdAAA==,只有 24 个字符,而不是 36 个。