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