← 返回博客

Base64 在 API 认证中的应用

2026-04-11 · 5 分钟阅读

← 返回博客

Base64 在 API 认证中的应用

· 5 分钟阅读

HTTP Basic Authentication 原理

HTTP Basic Authentication 是最古老也最简单的 API 认证机制之一,由 RFC 7617 定义。其原理非常直接:客户端将 "用户名:密码" 字符串进行 Base64 编码,然后放入 HTTP 请求头 Authorization: Basic [Base64编码值] 中发送给服务器。服务器解码后验证凭据是否正确。

# 生成 Basic Auth 头部
# Generate Basic Auth header
import base64

def make_basic_auth(username, password):
    credentials = f"{username}:{password}"
    encoded = base64.b64encode(credentials.encode('utf-8')).decode('ascii')
    return f"Basic {encoded}"

header = make_basic_auth("admin", "secret123")
print(header)
# Basic YWRtaW46c2VjcmV0MTIz

# 在 requests 库中使用
# Use with requests library
import requests
response = requests.get(
    'https://api.example.com/data',
    auth=('admin', 'secret123')  # requests 自动处理 Base64
)

Basic Auth 的安全风险

必须再次强调:Base64 不是加密。HTTP Basic Auth 中的凭据只是以 Base64 形式编码,任何能截获 HTTP 流量的人都能立即解码。因此,HTTP Basic Auth 必须严格与 HTTPS(TLS)结合使用,绝对不能在纯 HTTP 连接上使用。

另一个风险是凭据在每次请求中都被发送,增加了泄露的机会。现代 API 设计通常偏好基于令牌(Token)的认证方案(如 OAuth 2.0、JWT),仅在初次认证时发送凭据,后续使用有过期时间的令牌,降低了凭据被泄露的风险。

Stripe 等 API 的 Basic Auth 模式

一些知名 API(如 Stripe)使用 HTTP Basic Auth 的变体:将 API Key 作为用户名,密码留空。这样,API Key 被 Base64 编码后放入 Authorization 头部,格式为 Basic [Base64("api_key:")](注意冒号后面没有密码,但冒号必须存在)。

# Stripe API 风格的认证
# Stripe API-style authentication
import base64
import requests

api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
credentials = base64.b64encode(f"{api_key}:".encode()).decode()

response = requests.get(
    "https://api.stripe.com/v1/charges",
    headers={"Authorization": f"Basic {credentials}"}
)

Base64 在 OAuth 2.0 中的角色

在 OAuth 2.0 的客户端凭据流程(Client Credentials Flow)中,客户端需要向授权服务器发送 client_idclient_secret。根据 RFC 6749,推荐的方式是将 "client_id:client_secret" Base64 编码后放入 Authorization 头部,与 HTTP Basic Auth 的格式完全相同。

此外,OAuth 的 PKCE 扩展使用 Base64URL 编码 code_challenge,而 OAuth 令牌本身(Access Token、Refresh Token)如果是 JWT 格式,则使用 Base64URL 编码其头部和载荷。可见 Base64 在现代 API 认证体系中无处不在。

在 curl 中测试 Basic Auth API

# curl 直接支持 Basic Auth,自动处理 Base64
# curl natively supports Basic Auth, handles Base64 automatically
curl -u username:password https://api.example.com/endpoint

# 等价的手动方式 / Equivalent manual approach
ENCODED=$(echo -n "username:password" | base64)
curl -H "Authorization: Basic $ENCODED" https://api.example.com/endpoint

# 测试 Stripe API / Test Stripe API
curl -u sk_test_YOUR_KEY: https://api.stripe.com/v1/customers

# POST 请求示例 / POST request example
curl -u admin:password \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"name":"test"}' \
  https://api.example.com/resource

在 Postman 中配置 Basic Auth

Postman 内置了 Basic Auth 支持,无需手动编码。在请求的 Authorization 选项卡中,选择 "Basic Auth" 类型,然后输入用户名和密码,Postman 会自动生成正确的 Authorization 头部。这在测试 API 时非常方便,你也可以在 Postman 的请求头预览中看到生成的 Base64 编码值。

如果你需要测试一个使用非标准格式的 API(比如要求 Base64URL 而非标准 Base64),可以先在我们的在线工具中手动生成编码值,然后在 Postman 中选择 "No Auth" 并手动添加 Authorization 头部。

安全建议总结

使用 Basic Auth 的安全建议:(1)始终使用 HTTPS,从不在 HTTP 上使用;(2)考虑使用 API Key 替代用户名/密码,API Key 可以随时撤销而不影响账户密码;(3)为每个客户端或集成创建独立的凭据,方便独立撤销;(4)设置 IP 白名单或速率限制,防止凭据泄露后被滥用;(5)定期轮换(rotate)凭据。

在生产环境中,绝不应将 Base64 编码的凭据硬编码在源代码或版本控制系统中。应使用环境变量、密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault)或操作系统的密钥链来存储敏感凭据。

立即尝试在线工具,无需安装,免费使用。

打开工具 →

立即免费使用相关工具

免费使用 →