datai/docs/archive/decisions/adr/0008-datai-salesforce-auth-immediate-fixes.md

296 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: 0008-datai-salesforce-auth-immediate-fixes
description: datai-salesforce-auth 模块立即修复事项架构决策
---
# 架构决策记录: datai-salesforce-auth 模块立即修复事项
## 背景
经过对 `datai-salesforce-auth` 模块的详细扫描和分析,发现了以下影响系统编译、安全性和稳定性的问题:
1. **语法错误**: DataiSfLoginHistoryController 和 DataiSfLoginSessionController 中存在多余的右括号,导致代码无法编译
2. **密码加密不安全**: 使用对称加密存储密码,可以解密还原明文,存在数据泄露风险
3. **敏感信息日志泄露**: 日志中记录了 Session ID、用户名等敏感信息存在日志泄露风险
4. **缺少请求频率限制**: 登录接口没有请求频率限制,可能遭受暴力破解攻击
这些问题需要立即修复,以确保系统的正常运行和数据安全。
## 决策
针对上述问题,我们做出以下架构决策:
### 决策 1: 语法错误修复
**方案**: 直接修复语法错误,移除多余的右括号
**理由**: 语法错误导致代码无法编译,必须立即修复
**实施**:
- 在 DataiSfLoginHistoryController.java:82 移除多余的右括号
- 在 DataiSfLoginSessionController.java:82 移除多余的右括号
### 决策 2: 密码加密方式调整
**方案**: 使用不可逆的哈希算法BCrypt替代对称加密
**理由**:
- 对称加密可以解密还原明文,存在数据泄露风险
- BCrypt 是业界标准的密码哈希算法,具有抗彩虹表攻击能力
- BCrypt 自动处理盐值,提高安全性
**实施**:
- 修改数据库表结构,将 `password_encrypted` 字段改为 `password_hash`
- 修改 SalesforceLoginServiceImpl.java 中的密码存储逻辑
- 使用 BCrypt.hashpw() 方法对密码进行哈希
- 使用 BCrypt.checkpw() 方法验证密码
### 决策 3: 敏感信息日志脱敏
**方案**: 对敏感信息进行脱敏处理后再记录日志
**理由**:
- 防止日志泄露导致敏感信息泄露
- 满足安全合规要求(如 GDPR、等保三级
- 保留足够的调试信息(如 Session ID 前 8 位)
**实施**:
- 创建脱敏工具类 `SensitiveInfoMasker`
- 实现 `maskSensitiveInfo(String info)` 方法
- 在 SalesforceLoginServiceImpl.java 中所有日志记录处使用脱敏方法
- 脱敏规则Session ID 只显示前 8 位,用户 ID 只显示前 4 位
### 决策 4: 请求频率限制
**方案**: 使用 Spring Security 或 Redis 实现请求频率限制
**理由**:
- 防止暴力破解攻击
- 保护系统资源不被滥用
- 符合安全最佳实践
**实施**:
- 使用 Spring Security 的 `@RateLimiter` 注解
- 配置每分钟最多 5 次登录尝试
- 超过限制时返回明确的错误信息HTTP 429
- 使用 Redis 存储请求计数
## 备选方案
### 决策 1: 语法错误修复
**无备选方案**: 语法错误必须直接修复,无其他方案
### 决策 2: 密码加密方式调整
#### 方案 A: BCrypt已选择
**优点**:
- 业界标准,广泛使用
- 自动处理盐值
- 抗彩虹表攻击
- 内置成本因子,可调整计算复杂度
**缺点**:
- 计算较慢(但这是优点,防止暴力破解)
- 需要修改数据库表结构
#### 方案 B: PBKDF2
**优点**:
- NIST 推荐算法
- 可配置迭代次数
- 安全性高
**缺点**:
- 不如 BCrypt 常用
- 需要手动处理盐值
#### 方案 C: Argon2
**优点**:
- 密码哈希竞赛冠军
- 抗 GPU/ASIC 攻击
- 可配置内存和计算成本
**缺点**:
- 相对较新,兼容性可能有问题
- 需要额外的依赖
**选择理由**: BCrypt 是业界标准,成熟稳定,安全性足够,易于实施。
### 决策 3: 敏感信息日志脱敏
#### 方案 A: 自定义脱敏工具类(已选择)
**优点**:
- 灵活,可定制脱敏规则
- 不依赖外部库
- 易于维护
**缺点**:
- 需要自己实现
#### 方案 B: 使用 Logback Masking 插件
**优点**:
- 配置简单
- 自动脱敏
**缺点**:
- 灵活性差
- 需要额外配置
#### 方案 C: 使用第三方库(如 logback-mask
**优点**:
- 开箱即用
- 功能丰富
**缺点**:
- 增加依赖
- 可能不满足定制需求
**选择理由**: 自定义脱敏工具类更灵活,易于维护,不增加外部依赖。
### 决策 4: 请求频率限制
#### 方案 A: Spring Security @RateLimiter已选择
**优点**:
- 与 Spring Security 集成良好
- 使用注解,易于使用
- 支持 Redis 分布式部署
**缺点**:
- 需要 Redis 依赖
#### 方案 B: 自定义拦截器
**优点**:
- 不依赖外部库
- 灵活可定制
**缺点**:
- 需要自己实现
- 不支持分布式部署
#### 方案 C: 使用 Guava RateLimiter
**优点**:
- 轻量级
- 性能好
**缺点**:
- 单机限流,不支持分布式
- 需要手动集成
**选择理由**: Spring Security @RateLimiter 与现有架构集成良好,支持分布式部署。
## 影响
### 系统架构影响
1. **密码加密方式变更**: 需要修改数据库表结构,影响现有登录历史数据
2. **日志脱敏**: 需要修改所有日志记录处,影响调试体验
3. **请求频率限制**: 需要添加 Redis 依赖,影响部署架构
### 开发流程影响
1. **语法错误修复**: 立即修复,不影响开发流程
2. **密码加密方式变更**: 需要数据迁移脚本,影响开发流程
3. **日志脱敏**: 需要修改所有日志记录处,影响开发流程
4. **请求频率限制**: 需要添加 Redis 配置,影响开发流程
### 运维管理影响
1. **密码加密方式变更**: 需要执行数据迁移脚本,影响运维
2. **日志脱敏**: 不影响运维,反而提高安全性
3. **请求频率限制**: 需要部署 Redis影响运维
### 用户体验影响
1. **密码加密方式变更**: 不影响用户体验
2. **日志脱敏**: 不影响用户体验
3. **请求频率限制**: 可能影响用户体验(频繁登录时会被限制)
## 风险
### 技术风险
1. **密码加密方式变更风险**:
- **风险**: 现有登录历史数据无法使用
- **概率**: 高
- **缓解措施**: 提供数据迁移脚本,保留旧数据作为备份
2. **日志脱敏风险**:
- **风险**: 调试困难,无法看到完整信息
- **概率**: 中
- **缓解措施**: 提供调试模式开关,调试时可关闭脱敏
3. **请求频率限制风险**:
- **风险**: 误伤正常用户
- **概率**: 低
- **缓解措施**: 提供清晰的错误信息,用户知道被限制的原因
### 业务风险
1. **密码加密方式变更风险**:
- **风险**: 用户需要重新登录
- **概率**: 高
- **缓解措施**: 提前通知用户,说明变更原因
2. **请求频率限制风险**:
- **风险**: 自动登录可能被限制
- **概率**: 低
- **缓解措施**: 自动登录不受频率限制限制
### 实施风险
1. **数据库表结构变更风险**:
- **风险**: 表结构变更失败
- **概率**: 低
- **缓解措施**: 在测试环境充分测试,准备回滚脚本
## 回滚策略
### 决策 1: 语法错误修复
**回滚策略**: 使用 Git 回滚到修复前的版本
### 决策 2: 密码加密方式变更
**回滚策略**:
1. 恢复数据库表结构(添加 `password_encrypted` 字段)
2. 恢复代码(使用对称加密)
3. 从备份恢复数据
### 决策 3: 敏感信息日志脱敏
**回滚策略**: 移除脱敏逻辑,恢复原始日志记录
### 决策 4: 请求频率限制
**回滚策略**: 移除 `@RateLimiter` 注解,移除 Redis 配置
## 验收标准
### 决策 1: 语法错误修复
- [ ] AC1: 项目能够正常编译,无编译错误
- [ ] AC2: 登录功能正常工作
- [ ] AC3: 自动登录功能正常工作
### 决策 2: 密码加密方式变更
- [ ] AC1: 数据库表结构已更新(`password_hash` 字段已添加)
- [ ] AC2: 密码使用 BCrypt 哈希存储
- [ ] AC3: 密码验证使用 BCrypt.checkpw() 方法
- [ ] AC4: 现有登录历史数据已迁移
- [ ] AC5: 登录功能正常工作
### 决策 3: 敏感信息日志脱敏
- [ ] AC1: 日志中 Session ID 只显示前 8 位
- [ ] AC2: 日志中用户 ID 只显示前 4 位
- [ ] AC3: 所有日志记录处都使用了脱敏方法
- [ ] AC4: 调试模式开关正常工作
### 决策 4: 请求频率限制
- [ ] AC1: 每分钟最多 5 次登录尝试
- [ ] AC2: 超过限制时返回 HTTP 429 错误
- [ ] AC3: 错误信息清晰明确
- [ ] AC4: 自动登录不受频率限制限制
- [ ] AC5: Redis 存储请求计数正常工作
## 视觉锚点
### Visual Reference
引用 Canvas 的具体节点或快照:
- [Authentication.canvas](../../Authentication.canvas) - 认证模块架构图
- **具体节点**: [DataiSalesforceAuth](../../Authentication.canvas) - datai-salesforce-auth 模块
### Status
- [x] Draft
- [ ] Accepted
- [ ] Superceded
## 参考资料
列出与该决策相关的参考资料,包括文档、文章或其他资源。
- [需求文档](../requirements/REQ-008.md) - datai-salesforce-auth 模块立即修复事项
- [BCrypt 官方文档](https://bcrypt-generator.com/) - BCrypt 算法说明
- [Spring Security 文档](https://docs.spring.io/spring-security/reference/) - Spring Security Rate Limiting
- [OWASP 密码存储备忘单](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) - 密码存储最佳实践
- [等保三级要求](https://www.tc260.org.cn/) - 中国网络安全等级保护三级要求