feat: 实现动态密码系统,消除硬编码

核心改动:
1. db.rs - 默认密码从环境变量读取或自动生成
   - 优先级: MOMENTRY_DEFAULT_PASSWORD > 自动生成
   - 格式: demo_<timestamp> 或自定义
   - 首次创建时打印密码到控制台

2. main.rs - SMB 服务密码动态化
   - 从 SMB_PASSWORD 或 MOMENTRY_DEFAULT_PASSWORD 读取
   - 支持自定义 SMB 用户名

3. user_tool.rs - 新增用户管理工具
   - list: 列出所有用户
   - create: 创建新用户
   - set-password: 修改密码
   - delete: 删除用户
   - init-demo: 初始化 demo 用户

4. install.sh - 安装时自动生成密码
   - 生成随机密码: demo_$(openssl rand -hex 4)
   - 保存到 .env 文件
   - 初始化数据库

5. .env.template - 新增密码配置
   - MOMENTRY_DEFAULT_PASSWORD
   - SMB_USER / SMB_PASSWORD

安全改进:
- 消除硬编码密码 'demo123'
- 每次安装密码唯一
- 密码哈希存储 (Argon2id)
- 支持自定义强密码

文档:
- docs/DEFAULT_PASSWORD_SYSTEM.md 完整说明
This commit is contained in:
2026-10-12 14:25:47 +08:00
parent 14fe2eda07
commit 69ab0e8000
7 changed files with 724 additions and 5 deletions

View File

@@ -0,0 +1,464 @@
# 默认用户密码系统
**更新时间**: 2026-10-12
**状态**: ✅ 已实现动态密码系统
---
## 🎯 目标
**消除硬编码的默认密码 `demo123`,实现每次安装时自动生成唯一密码**
---
## ✅ 实现内容
### 1. 密码生成策略
**优先级顺序**:
1. **环境变量 `MOMENTRY_DEFAULT_PASSWORD`** (最高优先级)
- 手动设置:`export MOMENTRY_DEFAULT_PASSWORD=my_secure_password`
- 自动生成:`demo_<timestamp>`
2. **自动生成随机密码** (如果环境变量未设置)
- 格式:`demo_<6位随机数>`
- 示例:`demo_123456`, `demo_789012`
---
### 2. 修改的文件
#### `src-tauri/src/db.rs`
**修改内容**:
```rust
// 旧代码 (硬编码)
let default_password = "demo123";
// 新代码 (动态密码)
let default_password = std::env::var("MOMENTRY_DEFAULT_PASSWORD")
.unwrap_or_else(|_| {
use std::time::{SystemTime, UNIX_EPOCH};
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
format!("demo_{}", timestamp % 1000000) // demo_123456
});
```
**新增功能**:
- 首次创建用户时,打印默认密码到控制台
- 提示用户保存密码
---
#### `src-tauri/src/main.rs`
**SMB 服务密码修改**:
```rust
// 旧代码 (硬编码)
format!("... --user demo:demo123 ...")
// 新代码 (动态密码)
let smb_user = std::env::var("SMB_USER").unwrap_or_else(|_| "demo".to_string());
let smb_password = std::env::var("SMB_PASSWORD")
.or_else(|_| std::env::var("MOMENTRY_DEFAULT_PASSWORD"))
.unwrap_or_else(|_| {
// Fallback to a generated password
use std::time::{SystemTime, UNIX_EPOCH};
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
format!("smb_{}", timestamp % 1000000)
});
format!("... --user {}:{} ...", smb_user, smb_password)
```
---
### 3. 新增工具
#### `src-tauri/src/bin/user_tool.rs`
**用户管理命令行工具**:
```bash
# 列出所有用户
./user_tool list
# 创建新用户
./user_tool create <username> <password>
# 修改用户密码
./user_tool set-password <username> <password>
# 删除用户
./user_tool delete <username>
# 初始化 demo 用户
./user_tool init-demo
```
**特点**:
- 独立可执行文件,不依赖 Tauri 运行时
- 支持从环境变量读取默认密码
- 支持密码哈希(Argon2id)
---
### 4. 安装脚本更新
#### `install.sh`
**新增步骤 5.5**: 初始化默认用户
```bash
# 生成安全随机密码
DEFAULT_PASSWORD="demo_$(openssl rand -hex 4)"
# 设置环境变量
export MOMENTRY_DEFAULT_PASSWORD="${DEFAULT_PASSWORD}"
# 保存到 .env 文件
echo "MOMENTRY_DEFAULT_PASSWORD=${DEFAULT_PASSWORD}" >> .env
# 初始化数据库
./src-tauri/target/release/user_tool init-demo
```
**输出示例**:
```
========================================
Demo user initialized:
Username: demo
Password: demo_a1b2c3d4
========================================
```
---
### 5. 配置文件更新
#### `.env.template`
```bash
# ========================================
# 默认用户密码
# ========================================
# 在安装时自动生成,或手动设置
# 格式: demo_<random>
MOMENTRY_DEFAULT_PASSWORD=demo_change_this
# ========================================
# SMB 共享配置
# ========================================
SMB_USER=demo
SMB_PASSWORD=${MOMENTRY_DEFAULT_PASSWORD}
```
---
## 📊 架构对比
### 旧架构 (硬编码)
```
安装时
└─> 硬编码密码: demo123
└─> 所有安装使用相同密码
└─> 安全风险高 ❌
```
---
### 新架构 (动态密码)
```
安装时
├─> 检查环境变量 MOMENTRY_DEFAULT_PASSWORD
│ ├─> 已设置 → 使用该值
│ └─> 未设置 → 生成随机密码
│
├─> 保存到 .env 文件
│
└─> 初始化数据库
└─> 用户看到生成的密码
└─> 每次安装密码唯一 ✅
```
---
## 🔐 密码存储位置
### SQLite 数据库
**路径**: `data/users/demo.sqlite`
**表结构**:
```sql
CREATE TABLE app_users (
id TEXT PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
password_hash TEXT, -- Argon2id 哈希
display_name TEXT,
role TEXT DEFAULT 'user',
created_at TEXT,
updated_at TEXT
);
```
**存储方式**:
- 密码使用 Argon2id 算法哈希
- **不存储明文密码**
- 哈希格式:`$argon2id$v=19$m=19456,t=2,p=1$...`
---
### .env 文件
**路径**: `momentry_studio/.env`
**内容**:
```bash
MOMENTRY_DEFAULT_PASSWORD=demo_a1b2c3d4
```
**用途**:
- 首次启动时读取
- 传递给 SMB 服务
- 方便管理员查看
**安全性**:
- ⚠️ 文件权限应为 `600` (仅所有者可读写)
- ⚠️ 不要提交到 Git (已在 `.gitignore`)
---
## 🚀 使用流程
### 1. 自动安装 (推荐)
```bash
# 运行安装脚本
./install.sh
# 输出示例:
# ========================================
# Default user password: demo_a1b2c3d4
# Please save this password securely!
# ========================================
```
**脚本会自动**:
- 生成随机密码
- 保存到 `.env`
- 初始化数据库
- 打印密码给用户
---
### 2. 手动设置密码
```bash
# 设置环境变量
export MOMENTRY_DEFAULT_PASSWORD=my_secure_password
# 运行安装
./install.sh
# 或手动初始化
./src-tauri/target/release/user_tool init-demo
```
---
### 3. 查看用户列表
```bash
./src-tauri/target/release/user_tool list
# 输出:
# Users:
# ID Username Display Name Role
# ------------------------------------------------------------
# demo demo Demo User admin
```
---
### 4. 修改密码
```bash
./src-tauri/target/release/user_tool set-password demo new_password_123
# 输出:
# ✅ Password updated for user 'demo'
```
---
### 5. 创建新用户
```bash
./src-tauri/target/release/user_tool create admin secure_pass_456
# 输出:
# ✅ User 'admin' created successfully
```
---
## 📝 部署到新环境
### m4promini 环境
```bash
# 1. 克隆代码
cd ~
git clone <repo_url> momentry_studio
# 2. 运行安装
cd momentry_studio
./install.sh
# 3. 记录生成的密码 (例如: demo_a1b2c3d4)
# 4. 启动服务
./start.sh
```
**系统会自动**:
- 检测用户主目录:`/Users/nextorageai`
- 创建数据目录:`~/momentry/var/sftpgo/data`
- 生成唯一密码:`demo_<random>`
- 初始化 demo 用户
---
## ⚠️ 安全注意事项
### 1. 密码管理
✅ **推荐做法**:
- 使用强密码 (至少 12 位)
- 定期更换密码
- 不同环境使用不同密码
- 将 `.env` 文件权限设为 `600`
❌ **不推荐做法**:
- 使用硬编码密码
- 在代码中存储明文密码
- 多个环境共用相同密码
---
### 2. 文件权限
```bash
# 设置 .env 文件权限
chmod 600 .env
# 设置数据库文件权限
chmod 600 data/users/demo.sqlite
```
---
### 3. 环境隔离
每个环境应有独立的密码:
| 环境 | 用户 | 密码 | 配置文件 |
|-----|------|------|---------|
| m5max48 | demo | `demo_a1b2c3` | `/Users/accusys/momentry_studio/.env` |
| m4promini | demo | `demo_x9y8z7` | `/Users/nextorageai/momentry_studio/.env` |
| 生产环境 | demo | `demo_prod_...` | `/opt/momentry/.env` |
---
## 🛠️ 故障排除
### 问题 1: 忘记密码
```bash
# 方法 1: 查看 .env 文件
cat .env | grep MOMENTRY_DEFAULT_PASSWORD
# 方法 2: 重置密码
./src-tauri/target/release/user_tool set-password demo new_password
```
---
### 问题 2: 数据库初始化失败
```bash
# 检查数据库目录
ls -la data/users/
# 手动创建目录
mkdir -p data/users
# 重新初始化
./src-tauri/target/release/user_tool init-demo
```
---
### 问题 3: SMB 服务无法连接
```bash
# 检查 SMB 密码配置
cat .env | grep SMB_PASSWORD
# 确保密码一致
export SMB_PASSWORD=${MOMENTRY_DEFAULT_PASSWORD}
# 重启 SMB 服务
./src-tauri/target/release/momentry-studio # 或通过 GUI
```
---
## 📊 检查清单
在部署前确认:
- [ ] `.env` 文件已创建并包含 `MOMENTRY_DEFAULT_PASSWORD`
- [ ] `.env` 文件权限为 `600`
- [ ] 数据库文件已初始化
- [ ] demo 用户密码已记录
- [ ] SMB 密码已配置(如需 SMB 服务)
- [ ] 不同环境使用不同密码
- [ ] `.env` 文件已添加到 `.gitignore`
---
## 🎉 总结
### 改进前
- ❌ 硬编码密码 `demo123`
- ❌ 所有安装使用相同密码
- ❌ 无法自定义密码
- ❌ 安全风险高
---
### 改进后
- ✅ 动态生成唯一密码
- ✅ 每次安装密码独立
- ✅ 支持自定义密码
- ✅ 密码哈希存储
- ✅ 用户管理工具
- ✅ 安装自动化
---
**文档位置**: `docs/DEFAULT_PASSWORD_SYSTEM.md`
**Commit**: 待提交
**Status**: ✅ 已实现动态密码系统