共计 1193 个字符,预计需要花费 3 分钟才能阅读完成。
从一次真实的 Session Hijacking 攻击说起
去年我们的支付系统遭遇了一次精心设计的 Token Manipulation 攻击。攻击者通过中间人攻击截获了用户的 JWT 令牌,篡改了其中的用户 ID 和权限字段,将普通用户权限提升为管理员,并成功发起了多笔高额转账。这次事件让我们付出了惨痛代价,也促使我们深入研究了 Token Manipulation 的攻防技术。

令牌技术防篡改能力对比
JWT 令牌
- 采用 Base64URL 编码的 JSON 结构
- 支持 HMAC 或 RSA 签名防篡改
- 但 Payload 内容默认可见(除非加密)
Opaque Token
- 随机字符串,无实际含义
- 需要后端存储验证
- 天然防篡改但增加服务器压力
核心防御实现方案
基于 HMAC 的签名验证(Python 示例)
import hmac
import hashlib
def verify_hmac_token(token, secret_key):
try:
header_encoded, payload_encoded, signature_encoded = token.split('.')
# 重新计算签名
msg = f"{header_encoded}.{payload_encoded}".encode()
new_sig = hmac.new(secret_key.encode(), msg, hashlib.sha256).digest()
# 比较签名
return hmac.compare_digest(new_sig, base64url_decode(signature_encoded))
except Exception as e:
# 记录异常并返回验证失败
logging.error(f"Token 验证异常: {str(e)}")
return False
Token 绑定实现方案
- 客户端生成 TLS 会话指纹
- 通过
Sec-Token-Binding头传递 - 服务端验证指纹与 TLS 会话一致性
Redis 分布式吊销方案
// Java 实现示例
public boolean isTokenRevoked(String tokenId) {try (Jedis jedis = jedisPool.getResource()) {
// 设置自动过期时间
return jedis.exists("revoked:" + tokenId);
}
}
生产环境避坑指南
密钥轮换策略
- 采用双密钥机制(current/next)
- 新旧密钥并行使用 1 - 2 个令牌周期
- 使用 KMS 服务管理密钥版本
防止 Token 重放
- 设置合理的
exp过期时间(建议 15-30 分钟) - 记录已使用 Token 的 nonce 值
- 结合 IP/User-Agent 指纹检测异常
BREACH 攻击防护
- 禁用 HTTP 压缩
- 添加随机 padding
- 关键业务使用 CSRF Token 二次验证
延伸思考
- 有效期平衡:短期令牌 + 刷新令牌机制,结合风险评估动态调整
- 微服务验证:
- API 网关统一验证
- 共享签名密钥
- 使用 PASETO 等标准化格式
正文完
