fundplatform/doc/用户登录密码加密优化说明.md
zhangjf 46e30c8b06 优化用户登录密码加密方式:从 BCrypt 改为 MD5
主要变更:
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
2026-02-28 06:51:20 +08:00

5.6 KiB
Raw Blame History

用户登录密码加密方式优化说明

一、变更概述

变更日期: 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

-- 原 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 安全性考虑

  1. MD5 的安全性: MD5 已被证明不够安全,建议在生产环境中使用更安全的算法(如 bcrypt、scrypt
  2. 盐值: 当前实现未使用盐值,建议后续增加随机盐值提高安全性
  3. 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需要

  1. 导出所有用户数据
  2. 使用明文密码重新计算 MD5
  3. 批量更新数据库
  4. 或在用户首次登录时自动转换

八、测试验证

8.1 单元测试

@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. 尝试限制: 增加登录失败次数限制,防止暴力破解