使用方法
- 把十六进制字符串粘贴到输入框。源编码已预选为十六进制,目标编码为 Base64。
- 无需整理格式:空格、换行、冒号、短横线以及 0x 或 \x 前缀都会被忽略。
- 如果结果要用在 URL、JWT 或 JSON Web Key 中,请把目标编码改为 Base64URL。
- 复制 Base64 结果。
为什么要把十六进制转成 Base64
大多数哈希工具以十六进制输出摘要,但很多协议要求使用长度短三分之一的 Base64。典型场景包括:
- 子资源完整性(SRI)。脚本和样式表的
integrity属性使用 Base64 摘要,例如sha384-后接 64 个 Base64 字符。 - 内容安全策略(CSP)。允许内联脚本的哈希写作
'sha256-...',其中的值是 Base64。 - HTTP API 中的校验和。
Content-MD5头和 Amazon S3 的校验和头携带的是二进制摘要的 Base64,而不是md5sum输出的十六进制字符串。 - 更短的标识符。UUID 共 16 个字节,用十六进制写是 32 位,用无填充的 Base64URL 只需 22 个字符。
支持的十六进制格式
十六进制数字不区分大小写。解码前,转换器会去掉空白字符、换行、冒号、分号、逗号、短横线,以及 0x、\x、% 和 &#x 前缀。因此 AB:CD:EF 这样的 OpenSSL 指纹、0x12, 0x34 这样的 C 语言数组、\x12\x34 这样的转义字符串、百分号编码的字节以及带短横线的 UUID 都可以直接使用。
清理之后,数字个数必须是偶数,每两位表示一个字节。位数为奇数时会提示错误,这通常意味着丢失了开头的 0,比如本应是 0abc 却写成了 abc。
要编码字节,而不是十六进制文本
一个常见错误是把十六进制摘要粘贴到普通的“文本转 Base64”工具里。这样编码的是 0-9a-f 这些字符,而不是它们代表的字节,结果会比正确值长一倍:SHA-256 摘要会得到 88 个字符,而不是 44 个。SRI 属性、校验和头等需要二进制摘要的地方都会拒绝这样的值。本转换器会先把十六进制解码成字节,再进行编码。
# 命令行:十六进制摘要转 Base64
printf '%s' "$HEX" | xxd -r -p | base64
# 一步生成文件的 SRI 值
openssl dgst -sha384 -binary script.js | openssl base64 -A
# Python
base64.b64encode(bytes.fromhex(h)).decode()
// Node.js(遇到第一个非十六进制字符会静默停止)
Buffer.from(h, 'hex').toString('base64')
常见问题
为什么我的十六进制字符串报错?
要么输入中有不属于十六进制的字符,例如把数字 0 写成了字母 O;要么数字个数是奇数。错误提示会给出无效字符的位置;如果是奇数位,请检查是否漏掉了开头的 0。
Base64 结果会有多长?
先把十六进制位数除以 2 得到字节数,再按每 3 个字节 4 个字符计算并向上取整。64 位的 SHA-256 十六进制摘要会变成 44 个 Base64 字符,其中包括一个
=。如何生成子资源完整性(SRI)哈希?
计算文件的 SHA-384 摘要,在这里把十六进制结果转换为 Base64,然后写成
integrity="sha384-..."。使用 OpenSSL 也可以一条命令完成:openssl dgst -sha384 -binary file.js | openssl base64 -A。输出的是标准 Base64 还是 URL 安全格式?
默认输出带
+ 和 / 的标准 Base64,这正是 SRI、CSP 和 HTTP 校验和头所要求的格式。如果需要 URL 安全的结果,请把目标编码选为 Base64URL。