主要变更: 1. 新增 Md5Util 工具类,提供 MD5 加密和密码验证方法 2. 修改 AuthServiceImpl 直接比对 MD5 值(前端已加密,无需再次加密) 3. 修改 UserServiceImpl 使用 MD5 加密用户密码 4. 前端 Login.vue 添加 MD5 加密函数,提交前对密码进行 MD5 加密 5. 更新数据库初始化脚本,将 admin 密码改为 MD5 值 6. 更新设计文档中的密码加密说明 7. 添加 Lombok 依赖到 fund-sys 模块 8. 增加日志打印,记录密码加密过程便于调试 技术细节: - 前端流程:用户输入 → MD5 加密 → 传递给后端 - 后端流程:接收 MD5 值 → 与数据库 MD5 值直接 equals 比对 - 默认管理员密码:admin/admin123,MD5: 0192023a7bbd73250516f069df18b500
5.6 KiB
5.6 KiB
用户登录密码加密方式优化说明
一、变更概述
变更日期: 2026-02-13
变更类型: 安全优化
影响范围: 用户认证模块、前端登录页面
二、变更内容
2.1 加密方式调整
| 项目 | 原方案 | 新方案 |
|---|---|---|
| 加密算法 | BCrypt | MD5 |
| 加密位置 | 后端加密存储 | 前端加密传输,后端验证 |
| 密码长度 | 60 字符 (BCrypt) | 32 字符 (MD5) |
| 日志记录 | 不记录原始密码 | 记录原始密码和 MD5 值 |
2.2 技术实现
后端实现
-
新增 MD5 工具类
- 文件路径:
fund-common/src/main/java/com/fundplatform/common/util/Md5Util.java - 功能:提供 MD5 加密和密码验证方法
- 文件路径:
-
修改登录验证逻辑
- 文件路径:
fund-sys/src/main/java/com/fundplatform/sys/service/impl/AuthServiceImpl.java - 变更:
- 移除 BCryptPasswordEncoder
- 使用 Md5Util.matches() 进行密码验证
- 增加日志打印:原始密码和数据库存储的 MD5 密码
- 文件路径:
-
修改用户服务
- 文件路径:
fund-sys/src/main/java/com/fundplatform/sys/service/impl/UserServiceImpl.java - 变更:
- 创建用户时使用 MD5 加密
- 更新用户密码时使用 MD5 加密
- 重置密码时使用 MD5 加密
- 修改密码时使用 MD5 验证和加密
- 所有操作均记录原始密码和 MD5 值
- 文件路径:
前端实现
- 登录页面加密
- 文件路径:
fund-admin/src/views/login/index.vue - 变更:
- 添加 md5() 函数(建议使用 crypto-js 库)
- 提交前对密码进行 MD5 加密
- 控制台打印原始密码和加密后的密码
- 文件路径:
三、数据库变更
3.1 初始化脚本更新
文件: docker/mysql/init/01-init.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
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 安全性考虑
- MD5 的安全性: MD5 已被证明不够安全,建议在生产环境中使用更安全的算法(如 bcrypt、scrypt)
- 盐值: 当前实现未使用盐值,建议后续增加随机盐值提高安全性
- HTTPS: 必须使用 HTTPS 传输,防止中间人攻击
7.2 前端依赖建议
推荐安装成熟的 MD5 库:
npm install crypto-js
# 或
npm install blueimp-md5
使用示例:
// 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,需要:
- 导出所有用户数据
- 使用明文密码重新计算 MD5
- 批量更新数据库
- 或在用户首次登录时自动转换
八、测试验证
8.1 单元测试
@Test
public void testMd5Encryption() {
String password = "admin123";
String md5 = Md5Util.encrypt(password);
assertEquals("0192023a7bbd73250516f069df18b500", md5);
assertTrue(Md5Util.matches(password, md5));
}
8.2 集成测试
- 使用 admin/admin123 登录
- 检查日志输出的原始密码和 MD5 值
- 验证登录是否成功
九、相关文件清单
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.javafund-sys/src/main/java/com/fundplatform/sys/service/impl/UserServiceImpl.javafund-admin/src/views/login/index.vuedocker/mysql/init/01-init.sqldoc/sql/fund_sys_init.sqldoc/资金服务平台 FundPlatform 架构设计文档.mddoc/数据库设计文档.md
十、后续优化建议
- 增加盐值: 为每个用户生成随机盐值,与密码一起存储
- 多次哈希: 使用多次 MD5 迭代增加破解难度
- 升级算法: 考虑升级到 SHA-256 或 bcrypt
- 密码策略: 实施密码复杂度要求(长度、特殊字符等)
- 尝试限制: 增加登录失败次数限制,防止暴力破解