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

196 lines
5.6 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.

# 用户登录密码加密方式优化说明
## 一、变更概述
**变更日期**: 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. **尝试限制**: 增加登录失败次数限制,防止暴力破解