Files
momentry_studio/docs/DEFAULT_PASSWORD_SYSTEM.md
Momentry Studio 69ab0e8000 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 完整说明
2026-10-12 14:25:47 +08:00

464 lines
8.7 KiB
Markdown
Raw Permalink 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-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**: ✅ 已实现动态密码系统