跳到主要内容

HTTP 基本认证头怎么生成,Basic 认证从编码到 curl 全说清

讲清 Authorization Basic 头是把用户名冒号密码做 base64 得来的,给出真实编码示例与 curl 写法,说明 base64 不是加密必须配 HTTPS,并教你在浏览器本地生成不上传。

发布于 作者 李雷
#http #basic认证 #api测试 #base64 #curl

HTTP 基本认证头怎么生成,Basic 认证从编码到 curl 全说清

调内部 API 的时候,你大概率撞上过这样一句文档:「请在请求头里带上 Basic 认证」。然后就没了。没说令牌怎么拼,没说冒号放哪,没说编码用什么字符集。这篇就把 HTTP 基本认证头从头讲到尾,讲完你不光会拼,还知道哪里容易踩坑。

Basic 认证头到底是什么

它就是一行请求头,形如 Authorization: Basic <令牌>。其中 Basic 是认证方案名,后面跟一个 base64 字符串。这个 base64 不是凭空来的,它编码的是「用户名一个冒号密码」这串原文。

拆开看就三步:

  1. 把用户名和密码用一个英文冒号拼成 user:password
  2. 把这串字符按 UTF-8 取字节,做 base64 编码。
  3. 在前面加上 Basic 前缀,塞进 Authorization 头。

这里有个关键点容易被忽略:只有第一个冒号是分隔符。所以用户名里绝对不能带冒号,带了就会被切错;但密码里可以放冒号,后面所有内容都算密码。解码时按第一个冒号切分,带冒号的密码也能完整还原。

一个真实的编码例子

抽象的描述不如一个能核对的例子。假设用户名是 user,密码是 pass:

  • 拼接得到原文:user:pass
  • user:pass 做 base64,得到:dXNlcjpwYXNz
  • 完整的头就是:Authorization: Basic dXNlcjpwYXNz

想自己验一遍,在命令行里跑:

printf '%s' 'user:pass' | base64

输出正是 dXNlcjpwYXNz。注意 printf 不带换行,如果用 echo 会多一个换行符,base64 结果就不一样了,这是很多人手动核对时第一个翻车的地方。

如果你不想每次都开终端,可以直接用 Basic 认证头生成器,填用户名和密码,完整头、单独令牌、两段 curl 示例一起出来,还能反向把令牌解回用户名密码。

在 curl 里怎么用

curl 给了两种写法,场景不同。

第一种是简写,让 curl 自己拼头:

curl -u 'user:pass' https://api.example.com

第二种是把成品头直接贴上去:

curl -H 'Authorization: Basic dXNlcjpwYXNz' https://api.example.com

我自己更偏向第二种。有一次同事在群里问某个接口怎么调,我把 -H 那行直接发过去,他原样粘上就跑通了,省去了来回对密码的麻烦。而且 -H 这种写法分享时不会把明文密码当成单独的命令行参数回显,放进聊天记录里相对干净一点。当然这里说的「干净」是相对的,真要分享凭据,该换密码还是得换。

base64 不是加密,这是底线

这条单独拎出来讲,因为它是 Basic 认证最大的误解。base64 是编码,不是加密。任何人抓到你的 Authorization 头,一步就能把 dXNlcjpwYXNz 解回 user:pass,跟你自己解码没两样,没有任何密钥拦着。

所以结论很硬:Basic 认证只有跑在 HTTPS 上才安全。这时 TLS 会把整个请求,连同请求头一起加密,链路上的人看到的是密文。一旦你在纯 HTTP 上发 Basic 凭据,等于把密码喊给沿途每一跳听。

需要真正的签名或不可逆摘要时,Basic 认证不是那个工具。要对消息做带密钥的完整性校验,看 HMAC 生成器;要的是无状态的令牌鉴权,那是 JWT 的活,不是 Basic 头能替代的。

字符集与服务器侧的坑

非 ASCII 凭据是另一个静默失败的源头。令牌是对 UTF-8 字节做 base64,所以 用户名:密码 或带 emoji 的密码,只要两端都按 UTF-8 处理,就能干净往返。问题出在有些老服务器默认按 ISO-8859-1 解释 Basic 凭据,于是你这边编码没错,它那边解出来是乱的,登录就被拒。

排查办法很直接:先在本地把凭据编码再解码一遍,确认往返干净,令牌本身就排除了嫌疑,剩下的 bug 大概率在服务器的字符集配置上。RFC 7617 的默认和现代服务器都按 UTF-8 来,这是正道。

安全地在本地生成

最后一句不算技术、却最重要:别把真实生产密码粘进任何在线工具。靠谱的做法是工具全程在浏览器标签页里跑纯 JavaScript,用户名、密码、令牌都不离开页面,不发往服务器,也不写日志。即便如此,养成的习惯应该是先拿一个用完即弃的占位值生成格式,确认结构对了,再在本地脚本里换上真正的密钥。

如果你只是想单纯做一次 base64 编码解码,而不涉及认证头的拼装,用 Base64 编码解码工具 更顺手;要拼 Basic 头并配 curl 示例,就回到 Basic 认证头生成器。两个工具都在浏览器本地完成,不上传。


Made by Toolora · Updated 2026-06-13