《安全接口设计核心要点》
第3章 身份认证基础

3、身份认证基础:认证与授权区别、常见认证方式

🔐 认证 你是谁? 验证身份凭证 🔑 授权 你能做什么? 授予访问权限 先认证身份,再授权访问 → 顺序不可颠倒

📌 认证 vs 授权:核心区别

对比维度 认证 (Authentication) 授权 (Authorization)
核心问题 你是谁? 你能做什么?
目的 验证身份真实性 授予资源访问权限
传递方式 凭证(密码、Token、证书) 权限策略、角色、Scope
可见性 用户可见(登录界面) 通常对用户透明
示例 输入用户名+密码 管理员可删除,普通用户只读
💡 一句话总结:认证是“证明你是谁”,授权是“允许你做什么”。先认证,后授权,缺一不可。
Basic Auth 用户名:密码 Base64 编码 明文传输(不安全) ⚠ 仅用于HTTPS Digest Auth MD5 哈希摘要 挑战-响应机制 防重放攻击 ✅ 比Basic更安全 Token Auth JWT / Bearer Token 无状态、可扩展 现代API首选 🚀 推荐方案 安全等级:Basic Auth < Digest Auth < Token Auth

🔐 常见认证方式详解

1️⃣ Basic Auth(基本认证)

  • 原理:将 用户名:密码 用 Base64 编码后放入 HTTP 请求头 Authorization: Basic <编码字符串>
  • 特点:实现简单,所有浏览器和客户端原生支持
  • 安全风险:Base64 不是加密,可轻易解码;密码明文传输
  • 使用条件:必须搭配 HTTPS,否则密码完全暴露
  • 适用场景:内部工具、快速原型、低安全要求的 API
# 请求示例
GET /api/user/profile HTTP/1.1
Host: example.com
Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM=

# 解码后内容:admin:password123

2️⃣ Digest Auth(摘要认证)

  • 原理:服务器发送随机数(nonce),客户端用 MD5 对 用户名:realm:密码:nonce 进行哈希,返回摘要
  • 特点:密码不在网络中明文传输,使用挑战-响应机制
  • 安全增强:支持防重放攻击(通过 nonce 和计数器)
  • 局限性:仍依赖 MD5(已不再安全),无法防止中间人攻击(MITM)
  • 适用场景:遗留系统、无法使用 HTTPS 的受限环境
# 服务器返回 401 并携带 nonce
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="api@example.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"

# 客户端响应
Authorization: Digest username="admin", realm="api@example.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="/api/user/profile", response="7cff0b4f6962e9e6f7e8a1c3d4e5f6a7", opaque="5ccc069c403ebaf9f0171e9517f40e41"
📱 客户端 🖥 服务器 Basic Auth Authorization: Basic base64(user:pass) Digest Auth ① 401 + nonce ② Authorization: Digest response=hash(nonce+user+pass)

📊 认证方式对比总结

特性 Basic Auth Digest Auth Token Auth (JWT)
密码传输 明文(Base64) 哈希摘要 不传输密码
防重放 ❌ 无 ✅ 有(nonce) ✅ 有(过期时间)
实现复杂度 ⭐ 极低 ⭐⭐ 中等 ⭐⭐⭐ 较高
无状态 ✅ 是 ✅ 是 ✅ 是
推荐场景 内部工具、快速测试 遗留系统、受限环境 现代API、微服务

📖 安全设计建议:对于生产环境,强烈推荐使用 Token 认证(如 JWT),配合 HTTPS 传输。Basic Auth 仅用于开发测试或内部低安全网络。Digest Auth 虽比 Basic 安全,但 MD5 已不再安全,建议逐步迁移至 Token 方案。

专注课程资料整理