Project 4 - 授权码管理与 PKCE

实验目标 本周我们将实现 OAuth 2.0 的核心:授权码流程。完成本实验后,你将能够: ✅ 理解授权码在 OAuth 2.0 流程中的关键作用 ✅ 实现授权码的创建和一次性使用验证 ✅ 理解授权码被截获的安全威胁 ✅ 实现 PKCE(Proof Key for Code Exchange)安全增强 ✅ 掌握 SHA-256 哈希和 Base64 URL 编码 理论背景 1. 授权码流程详解 1.1 为什么需要授权码? OAuth 2.0 使用两步验证而非直接颁发访问令牌,主要出于安全考虑: ❌ 不安全的单步流程(隐式授权): 用户登录 → SSO 直接返回访问令牌到浏览器 问题:访问令牌暴露在浏览器历史记录、日志中 ✅ 安全的两步流程(授权码): 步骤 1:用户登录 → SSO 返回临时授权码到浏览器 步骤 2:客户端后端用授权码 + 密钥换取访问令牌 优势:访问令牌只在后端传输,永不经过浏览器 1.2 授权码的生命周期 时间轴: T0: 用户完成登录,SSO 生成授权码 授权码特性: - 随机生成(UUID 或密码学随机数) - 生命周期极短(5 分钟) - 一次性使用(use once and destroy) T0+30s: 客户端用授权码换取令牌 授权码被立即销毁 T0+5min: 授权码自动过期 (即使未被使用) 2. 授权码截获攻击与 PKCE 2.1 授权码截获攻击场景 攻击场景:恶意应用截获授权码 正常流程: 1. 合法 App 发起授权请求 2. 用户登录,SSO 重定向到 callback URL 3. 恶意 App 拦截重定向(通过注册相同的 URL Scheme) 4. 恶意 App 获取授权码 5. 恶意 App 用授权码 + 客户端密钥换取令牌 ← 问题! 在移动应用中,客户端密钥无法安全存储 (反编译即可获取) 2.2 PKCE 工作原理 PKCE(读作 “pixy”)通过动态密钥解决此问题: ...

January 29, 2025 · 5 min · Theme PaperMod

Project 2 - 用户和客户端验证

实验目标 本周我们将实现 OAuth 2.0 授权流程的第一道防线:身份验证。完成本实验后,你将能够: ✅ 实现安全的用户密码验证(使用 BCrypt) ✅ 实现账户锁定机制(防止暴力破解) ✅ 实现密码过期策略(强制定期更换密码) ✅ 实现客户端应用验证(验证 client_id、client_secret 和 redirect_uri) ✅ 理解重定向 URI 验证的安全重要性 理论背景 1. 用户认证的安全原则 1.1 密码存储 绝对禁止:以明文或可逆加密方式存储密码 推荐方案:使用强单向哈希算法(BCrypt、Argon2、PBKDF2) BCrypt 优势: 内置盐值(Salt),每次哈希结果不同 计算成本可调(通过 work factor 参数) 抗彩虹表攻击 示例: // 生成密码哈希 String hashedPassword = passwordEncoder.encode("userPassword123"); // 输出类似:$2a$10$N9qo8uLOickgx2ZMRZoMye1J9rY7AVMZ8tPNLPZdRs5u5xP5c5fUa // 验证密码 boolean matches = passwordEncoder.matches("userPassword123", hashedPassword); // 返回 true 1.2 账户锁定策略 目的:防止暴力破解攻击 实现方案: 追踪每个用户的连续登录失败次数 达到阈值(如 5 次)后锁定账户一段时间(如 10 分钟) 成功登录后清除失败计数器 使用缓存的原因: 高性能:失败计数不需要持久化到数据库 自动过期:利用缓存的 TTL 特性实现锁定时间 降低数据库压力 1.3 密码过期策略 目的:降低长期使用同一密码的风险 ...

January 15, 2025 · 4 min · Theme PaperMod