探秘 Web 认证机制:从基础到 JWT攻防实战
字数 3999 2025-08-22 12:23:41
Web认证机制深度解析:从基础到JWT攻防实战
一、HTTP Basic Auth认证机制
基本概念
HTTP Basic Auth是一种简单的Web认证方式,客户端在请求时通过HTTP头提供用户名和密码形式的凭证。
实现原理
- 用户名和密码以明文形式通过HTTP头传输
- 采用Base64编码(注意:仅是编码,非加密)
- 格式:
Authorization: Basic base64(username:password)
安全风险
- 明文传输:Base64可轻易解码获取原始凭证
- 暴力破解:容易遭受字典攻击和暴力破解
- 会话固定:缺乏有效的会话管理机制
典型应用场景
- Tomcat管理界面等内部系统
- 简单的API认证
攻击手法
- 直接解码Base64获取凭证
- 使用Burp Suite等工具进行暴力破解
- 中间人攻击获取认证信息
防御措施
- 必须配合HTTPS使用
- 实施账户锁定机制
- 使用强密码策略
- 考虑替代更安全的认证方式
二、OAuth2认证机制
基本概念
OAuth2是一种授权框架,允许用户授权第三方应用访问其在其他服务上的特定信息,而无需共享密码。
核心组件
- 资源所有者(Resource Owner):用户
- 客户端(Client):第三方应用
- 授权服务器(Authorization Server):颁发令牌的服务
- 资源服务器(Resource Server):托管受保护资源的服务
授权流程
- 客户端引导用户到授权服务器
- 用户授权客户端访问特定资源
- 授权服务器颁发授权码给客户端
- 客户端用授权码换取访问令牌
- 客户端使用访问令牌访问资源
关键参数解析
https://www.xxx.com/v2.0/dialog/oauth?
client_id=123
&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth%2Fcallback
&response_type=code
&scope=email
&state=XYZ
- client_id:标识客户端应用
- redirect_uri:授权完成后的回调地址
- response_type:期望的响应类型(code/token)
- scope:请求的权限范围
- state:CSRF防护令牌
- code:用于交换令牌的授权码
- token:访问资源的凭证
常见安全漏洞
-
redirect_uri绕过:导致授权劫持
- 攻击者注册相似域名
- 服务端redirect_uri验证不严
-
scope越权:获取超出预期的权限
- 默认scope设置过高
- 客户端可以修改scope参数
-
令牌泄露:
- 令牌传输过程被截获
- 客户端存储不安全
-
客户端伪造:
- client_id可预测或枚举
- 缺乏客户端认证机制
-
CSRF攻击:
- state参数缺失或可预测
- 导致绑定攻击者账户
防御策略
- 严格验证redirect_uri,使用完整匹配
- 实施最小权限原则,合理设置scope
- 使用PKCE(Proof Key for Code Exchange)扩展
- 确保令牌传输和存储安全
- 强制使用state参数并验证
- 实施短期有效的令牌和刷新机制
三、JWT(JSON Web Token)深度解析
JWT概述
JWT是一种基于Token的无状态认证机制,用于在身份提供者和服务提供者之间传递已认证的用户身份信息。
与传统Session认证对比
| 特性 | JWT | Session |
|---|---|---|
| 状态 | 无状态 | 有状态 |
| 存储位置 | 客户端 | 服务端 |
| 扩展性 | 高(适合分布式系统) | 低(需要会话共享) |
| 性能 | 高(无需查库) | 低(需要查会话状态) |
| 安全性 | 依赖签名算法 | 依赖会话管理机制 |
JWT结构
由三部分组成,以点(.)分隔:
Header.Payload.Signature
1. Header(头部)
包含令牌类型和签名算法信息,Base64Url编码。
示例:
{
"alg": "HS256",
"typ": "JWT"
}
常用签名算法:
| 算法类型 | 算法名称 | 描述 |
|---|---|---|
| HMAC | HS256 | HMAC with SHA-256 |
| HS384 | HMAC with SHA-384 | |
| HS512 | HMAC with SHA-512 | |
| RSA | RS256 | RSASSA-PKCS1-v1_5 with SHA-256 |
| RS384 | RSASSA-PKCS1-v1_5 with SHA-384 | |
| RS512 | RSASSA-PKCS1-v1_5 with SHA-512 | |
| ECDSA | ES256 | ECDSA with curve P-256 and SHA-256 |
| ES384 | ECDSA with curve P-384 and SHA-384 | |
| ES512 | ECDSA with curve P-521 and SHA-512 |
2. Payload(负载)
包含声明(claims),分为三类:
- 注册声明:预定义的JWT标准字段
- 公共声明:可自定义但应在IANA注册
- 私有声明:自定义的特定业务信息
标准注册声明:
- iss (Issuer):签发者
- exp (Expiration Time):过期时间
- sub (Subject):主题(用户ID等)
- aud (Audience):接收方
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):唯一标识
示例:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
3. Signature(签名)
用于验证消息未被篡改,创建方式:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT完整示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
解码后:
- Header:
{"alg":"HS256","typ":"JWT"} - Payload:
{"sub":"1234567890","name":"John Doe","iat":1516239022} - Signature: 使用HS256算法和密钥生成的签名
JWT攻击手法及防御
1. 算法篡改攻击(None算法)
- 攻击原理:将alg改为"none",删除签名部分
- 防御:在解码时明确指定预期算法
2. 弱密钥攻击
- 攻击原理:对HS256算法暴力破解弱密钥
- 防御:使用强密钥(至少256位随机字符串)
3. RS256与HS256混淆攻击
- 攻击原理:当服务端预期RS256但接受HS256时,攻击者可以使用公钥作为HMAC密钥伪造令牌
- 防御:严格校验算法类型,不混合使用不同算法
4. 密钥泄露攻击
- 攻击原理:获取签名密钥后任意伪造令牌
- 防御:保护密钥安全,定期轮换
5. 无效签名验证
- 攻击原理:服务端未验证签名
- 防御:始终验证签名有效性
6. 信息泄露
- 攻击原理:Payload中的敏感信息可被Base64解码读取
- 防御:不在JWT中存储敏感信息
7. 重放攻击
- 攻击原理:重复使用有效JWT
- 防御:使用短期有效的JWT,结合jti声明
8. 算法降级攻击
- 攻击原理:诱使服务端使用较弱算法
- 防御:只允许强算法(如RS256, ES256)
JWT最佳实践
-
算法选择:
- 优先使用RS256/ES256等非对称算法
- 如使用HS256,必须保证密钥强度
-
令牌有效期:
- 设置合理的exp声明
- 使用短期访问令牌+长期刷新令牌机制
-
敏感数据:
- 不在JWT中存储密码等敏感信息
- 尽量减少Payload大小
-
传输安全:
- 始终通过HTTPS传输
- 避免使用URL参数传递JWT(可能被记录)
-
存储安全:
- 浏览器端使用HttpOnly的Cookie存储
- 移动端使用安全存储机制
-
输入验证:
- 严格验证所有声明(iss, aud, exp等)
- 不信任任何客户端提供的数据
-
密钥管理:
- 定期轮换签名密钥
- 使用密钥管理系统保护密钥
四、综合对比与选择建议
| 认证机制 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| HTTP Basic Auth | 内部简单系统 | 实现简单 | 安全性低,需配合HTTPS |
| OAuth2 | 第三方授权 | 无需共享密码,细粒度控制 | 实现复杂,易配置错误 |
| JWT | 分布式系统,API认证 | 无状态,扩展性好 | 令牌撤销困难,需精心设计 |
选择建议:
- 简单内部系统:HTTP Basic Auth + HTTPS
- 第三方集成:OAuth2
- 分布式/微服务架构:JWT
- 高安全要求场景:JWT + OAuth2组合
五、实战检测清单
JWT安全检测项
- 检查是否使用none算法
- 尝试删除签名部分
- 测试弱密钥(使用hashcat/jwt_tool)
- 检查是否接受无效签名
- 验证算法混淆可能性
- 检查敏感信息泄露
- 验证令牌有效期设置
- 检查jti重放防护
OAuth2安全检测项
- redirect_uri开放重定向测试
- scope参数修改测试
- state参数CSRF测试
- 授权码泄露测试
- 客户端伪造测试
- PKCE缺失检测
HTTP Basic Auth检测项
- Base64解码测试
- 暴力破解测试
- HTTPS强制检查
- 认证失败锁定测试
通过全面理解和实施这些认证机制的安全措施,可以显著提升Web应用的安全性,有效防御各类认证相关的攻击。