--- 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/) - 中国网络安全等级保护三级要求