前言:通过同时讲诉服务器和客户端的处理情况,来理通思维,便于理解整个Basic Authentication认证过程.

一.先普及一下基础知识:
Base64 是一种将二进制数据转换为 ASCII 字符串的编码方式,使用 64 个可打印字符(A-Z, a-z, 0-9, +, /)表示二进制内容,并在末尾用 = 填充。其核心目的是解决二进制数据在纯文本协议(如 HTTP)中传输时的兼容性问题。
HTTP 基本认证(Basic Authentication) 作用:将用户名和密码拼接为 username:password 格式后 Base64 编码,置于 Authorization: Basic <凭证> 头中传输。例如:
GET /protected-resource HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd2Q=
Base64优势
-
文本协议兼容性
确保二进制数据(如加密哈希、文件内容)在 HTTP 头或 URL 中不因非 ASCII 字符被截断或转义。 -
简易性与通用性
- 所有编程语言均支持 Base64 编解码库(如 Python 的
base64、C 的mbedtls_base64)。 - 无需复杂配置,适合快速实现轻量级数据封装。
- 所有编程语言均支持 Base64 编解码库(如 Python 的
Base64局限性
-
数据膨胀
Base64 编码后数据体积增加约 33%(每 3 字节二进制数据扩展为 4 字符),可能影响传输效率。 -
无加密保护
Base64 仅编码而非加密,攻击者可轻易解码还原原始数据(建议配合 HTTPS 弥补安全性)。
二.HTTP基本认证的原理
- 认证流程
- 步骤1:客户端首次请求
客户端发送不带认证信息的HTTP请求到服务器受保护资源:GET /protected-resource HTTP/1.1 - 步骤2:服务器返回质询(Challenge)
服务器返回401 Unauthorized状态码,并在响应头中添加:WWW-Authenticate: Basic realm="SecureArea"
其中realm定义受保护资源的安全域,浏览器会弹出用户名/密码输入框。 - 步骤3:客户端发送凭证
用户输入凭据后,客户端将username:password拼接后进行Base64编码,生成Authorization头:Authorization: Basic dXNlcjpwYXNzd29yZA== - 步骤4:服务器验证
服务器解码Base64字符串,分离用户名和密码进行校验,通过则返回资源,失败则重复步骤2。
- 步骤1:客户端首次请求
- 安全性问题
- Base64仅为编码而非加密,凭证易被解码为明文,需配合HTTPS保证传输安全。
- 无法防御重放攻击,攻击者可截获凭证后重复使用。
-
Base64编码依赖
使用mbedtls/base64.h库进行编码,需在menuconfig中启用MBEDTLS_BASE64_C组件。 -
esp32 idf实现细节:
客户端发送请求访问受限区域,服务器返回401未授权,要求认证。客户端将用户名和密码拼接成“username:password”格式,进行Base64编码,然后放在Authorization头的Basic字段中发送。服务器解码验证,通过则返回资源。
对于服务器部分,需要ESP-IDF的httpd组件,创建HTTP服务器。处理函数中,检查请求头中的Authorization字段,如果没有,发送401,并设置WWW-Authenticate头。如果有,解码Base64,验证用户名密码。
对于客户端部分,使用esp_http_client组件。当发起请求时,如果服务器返回401,需要处理重试,或者直接预先添加Authorization头。自动处理401可能需要客户端自己处理,或者直接在第一次请求时添

2652

被折叠的 条评论
为什么被折叠?



