# 用户登录密码加密方式优化说明 ## 一、变更概述 **变更日期**: 2026-02-13 **变更类型**: 安全优化 **影响范围**: 用户认证模块、前端登录页面 ## 二、变更内容 ### 2.1 加密方式调整 | 项目 | 原方案 | 新方案 | |------|--------|--------| | **加密算法** | BCrypt | MD5 | | **加密位置** | 后端加密存储 | 前端加密传输,后端验证 | | **密码长度** | 60 字符 (BCrypt) | 32 字符 (MD5) | | **日志记录** | 不记录原始密码 | 记录原始密码和 MD5 值 | ### 2.2 技术实现 #### 后端实现 1. **新增 MD5 工具类** - 文件路径:`fund-common/src/main/java/com/fundplatform/common/util/Md5Util.java` - 功能:提供 MD5 加密和密码验证方法 2. **修改登录验证逻辑** - 文件路径:`fund-sys/src/main/java/com/fundplatform/sys/service/impl/AuthServiceImpl.java` - 变更: - 移除 BCryptPasswordEncoder - 使用 Md5Util.matches() 进行密码验证 - 增加日志打印:原始密码和数据库存储的 MD5 密码 3. **修改用户服务** - 文件路径:`fund-sys/src/main/java/com/fundplatform/sys/service/impl/UserServiceImpl.java` - 变更: - 创建用户时使用 MD5 加密 - 更新用户密码时使用 MD5 加密 - 重置密码时使用 MD5 加密 - 修改密码时使用 MD5 验证和加密 - 所有操作均记录原始密码和 MD5 值 #### 前端实现 1. **登录页面加密** - 文件路径:`fund-admin/src/views/login/index.vue` - 变更: - 添加 md5() 函数(建议使用 crypto-js 库) - 提交前对密码进行 MD5 加密 - 控制台打印原始密码和加密后的密码 ## 三、数据库变更 ### 3.1 初始化脚本更新 **文件**: `docker/mysql/init/01-init.sql` ```sql -- 原 BCrypt 密码 VALUES (1, 'admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', ...) -- 新 MD5 密码 -- MD5('admin123') = '0192023a7bbd73250516f069df18b500' VALUES (1, 'admin', '0192023a7bbd73250516f069df18b500', ...) ``` ### 3.2 表结构注释更新 **文件**: `doc/sql/fund_sys_init.sql` ```sql password VARCHAR(128) NOT NULL COMMENT '密码 (MD5)', ``` ## 四、设计文档更新 ### 4.1 架构设计文档 - **文件**: `doc/资金服务平台 FundPlatform 架构设计文档.md` - **变更**: ``` | 密码加密 | MD5(前端加密后传输,后端验证) | ``` ### 4.2 数据库设计文档 - **文件**: `doc/数据库设计文档.md` - **变更**: ``` | password | VARCHAR | 100 | 是 | - | 密码(MD5 加密存储) | ``` ### 4.3 API 接口文档 - **文件**: `doc/API 接口文档.md` - **已有说明**: ``` | password | String | 是 | 密码(MD5 加密后传输) | ``` ## 五、日志输出示例 ### 5.1 登录验证日志 ``` INFO: 登录验证 - 原始密码:admin123, 数据库存储的 MD5 密码:0192023a7bbd73250516f069df18b500 INFO: 登录成功:userId=1, username=admin, tenantId=1 ``` ### 5.2 创建用户日志 ``` INFO: 创建用户 - 原始密码:123456, MD5 加密后:e10adc3949ba59abbe56e057f20f883e INFO: 创建用户成功:userId=2, username=testuser ``` ### 5.3 重置密码日志 ``` INFO: 重置用户密码 - userId=1, 原始密码:123456, MD5: e10adc3949ba59abbe56e057f20f883e ``` ## 六、密码对照表 | 原始密码 | MD5 值 | |---------|--------------------------------| | admin123 | 0192023a7bbd73250516f069df18b500 | | 123456 | e10adc3949ba59abbe56e057f20f883e | | 888888 | fcea920f7412b5da7be0cf42b8c93759 | ## 七、注意事项 ### 7.1 安全性考虑 1. **MD5 的安全性**: MD5 已被证明不够安全,建议在生产环境中使用更安全的算法(如 bcrypt、scrypt) 2. **盐值**: 当前实现未使用盐值,建议后续增加随机盐值提高安全性 3. **HTTPS**: 必须使用 HTTPS 传输,防止中间人攻击 ### 7.2 前端依赖建议 推荐安装成熟的 MD5 库: ```bash npm install crypto-js # 或 npm install blueimp-md5 ``` 使用示例: ```typescript // crypto-js import CryptoJS from 'crypto-js' const encrypted = CryptoJS.MD5(password).toString() // blueimp-md5 import md5 from 'blueimp-md5' const encrypted = md5(password) ``` ### 7.3 数据迁移 如需从 BCrypt 迁移到 MD5,需要: 1. 导出所有用户数据 2. 使用明文密码重新计算 MD5 3. 批量更新数据库 4. 或在用户首次登录时自动转换 ## 八、测试验证 ### 8.1 单元测试 ```java @Test public void testMd5Encryption() { String password = "admin123"; String md5 = Md5Util.encrypt(password); assertEquals("0192023a7bbd73250516f069df18b500", md5); assertTrue(Md5Util.matches(password, md5)); } ``` ### 8.2 集成测试 1. 使用 admin/admin123 登录 2. 检查日志输出的原始密码和 MD5 值 3. 验证登录是否成功 ## 九、相关文件清单 ### 9.1 新增文件 - `fund-common/src/main/java/com/fundplatform/common/util/Md5Util.java` ### 9.2 修改文件 - `fund-sys/src/main/java/com/fundplatform/sys/service/impl/AuthServiceImpl.java` - `fund-sys/src/main/java/com/fundplatform/sys/service/impl/UserServiceImpl.java` - `fund-admin/src/views/login/index.vue` - `docker/mysql/init/01-init.sql` - `doc/sql/fund_sys_init.sql` - `doc/资金服务平台 FundPlatform 架构设计文档.md` - `doc/数据库设计文档.md` ## 十、后续优化建议 1. **增加盐值**: 为每个用户生成随机盐值,与密码一起存储 2. **多次哈希**: 使用多次 MD5 迭代增加破解难度 3. **升级算法**: 考虑升级到 SHA-256 或 bcrypt 4. **密码策略**: 实施密码复杂度要求(长度、特殊字符等) 5. **尝试限制**: 增加登录失败次数限制,防止暴力破解