企业级 CD Key 卡密生成与管理系统,支持密钥生成、验证、激活、生命周期管理,以及完整的 RBAC 权限和审计日志。
- 密钥生成 — 基于密码学安全的随机密钥生成,支持自定义模板(字符集、段数、前缀、有效期)
- 密钥验证 / 激活 — 公开 API,无需认证,支持仅验证或验证并激活,带频率限制
- 生命周期管理 — 冻结、解冻、销毁(不可逆),批量操作支持
- 安全存储 — AES-256-GCM 加密存储、SHA-256 哈希索引、HMAC 完整性校验
- RBAC 权限 — 6 个默认角色、26 项细粒度权限,支持自定义角色
- 审计日志 — 自动记录所有操作,SHA-256 链式哈希防篡改,支持完整性验证
- 用户管理 — 用户注册(需审核)、角色分配、密码重置
- 数据看板 — 密钥统计、生成/激活趋势图
| 层 |
技术 |
| 后端 |
Express 4 + TypeScript + sql.js (SQLite WASM) |
| 前端 |
React 18 + Ant Design 5 + Zustand + Vite 5 |
| 安全 |
bcryptjs + JWT 双令牌 + AES-256-GCM + SHA-256 + HMAC |
| 验证 |
Zod |
- Node.js >= 18.0.0
- npm >= 9
# 克隆项目
git clone https://github.com/shining-orange/CDKeyGenerator.git
cd CDKeyGenerator
# 安装依赖
npm install
# 配置环境变量
cp .env.example .env
# 编辑 .env 修改 JWT_SECRET 和 ENCRYPTION_ROOT_KEY
# 初始化数据库(首次运行)
npm run db:init
# 启动开发服务器(前后端同时启动)
npm run dev
前端访问 http://localhost:5173 ,后端 API 地址 http://localhost:3000 。
| 用户名 |
密码 |
角色 |
| admin |
admin123 |
super_admin |
新注册用户默认未激活,需管理员在后台审核通过。
CDKeyGenerator/
├── server/ # 后端服务
│ └── src/
│ ├── config/ # 环境变量、常量、限流配置
│ ├── db/ # 数据库 Schema、迁移、种子数据
│ ├── middleware/ # 认证、RBAC、审计、限流、校验
│ ├── routes/ # 路由定义(9 个模块)
│ ├── controllers/ # 请求处理
│ ├── services/ # 业务逻辑(加密、密钥生成、审计等)
│ ├── validators/ # Zod 请求校验
│ ├── types/ # TypeScript 类型定义
│ └── utils/ # 工具函数
├── client/ # 前端应用
│ └── src/
│ ├── api/ # Axios API 客户端
│ ├── pages/ # 页面组件(10 个页面)
│ ├── stores/ # Zustand 状态管理
│ ├── router/ # 路由守卫
│ ├── hooks/ # 自定义 Hooks
│ ├── styles/ # 全局样式
│ └── utils/ # 工具函数
└── package.json # Monorepo 工作区配置(npm workspaces)
| 路径 |
页面 |
权限 |
/login |
登录 |
公开 |
/activate |
卡密验证/激活 |
公开 |
/dashboard |
数据看板 |
dashboard:view |
/keys |
密钥管理 |
key:view |
/batches |
批次管理 |
batch:view |
/templates |
密钥模板 |
template:view |
/users |
用户管理 |
user:view |
/audit |
审计日志 |
audit:view |
/settings |
系统设置 |
role:view |
/profile |
个人资料 |
登录即可 |
| 方法 |
路径 |
说明 |
| GET |
/api/health |
健康检查 |
| GET |
/api/auth/captcha |
获取 SVG 验证码 |
| POST |
/api/auth/login |
登录(返回 access + refresh Token) |
| POST |
/api/auth/register |
用户注册(需管理员审核) |
| POST |
/api/auth/refresh |
刷新访问令牌 |
| 方法 |
路径 |
限流 |
说明 |
| POST |
/api/verify |
10 次/分钟 |
验证或激活密钥 |
| POST |
/api/verify/check |
20 次/分钟 |
仅验证密钥有效性 |
请求示例:
# 验证密钥
curl -X POST http://localhost:3000/api/verify \
-H "Content-Type: application/json" \
-d '{"keyCode":"XXXX-XXXX-XXXX-XXXX"}'
# 激活密钥
curl -X POST http://localhost:3000/api/verify \
-H "Content-Type: application/json" \
-d '{"keyCode":"XXXX-XXXX-XXXX-XXXX","activate":true}'
响应格式:
{
"success": true,
"data": {
"valid": true,
"status": "activated",
"message": "密钥已成功激活",
"expiresAt": "2025-12-31T23:59:59.000Z",
"activatedAt": "2025-06-15T10:30:00.000Z"
}
}
错误码:
| 错误码 |
说明 |
| INVALID_KEY |
无效密钥 |
| KEY_EXPIRED |
密钥已过期 |
| KEY_FROZEN |
密钥已被冻结 |
| KEY_DESTROYED |
密钥已销毁 |
| KEY_ALREADY_ACTIVATED |
密钥已被使用 |
| HMAC_MISMATCH |
密钥校验失败 |
| 方法 |
路径 |
权限 |
说明 |
| GET |
/api/keys |
key:view |
密钥列表(分页、筛选) |
| GET |
/api/keys/stats |
key:view |
密钥统计 |
| POST |
/api/keys/generate |
key:generate |
生成密钥 |
| POST |
/api/keys/export |
key:export |
导出密钥(JSON/CSV) |
| PUT |
/api/keys/:id/freeze |
key:freeze |
冻结密钥 |
| PUT |
/api/keys/:id/unfreeze |
key:freeze |
解冻密钥 |
| DELETE |
/api/keys/:id |
key:destroy |
销毁密钥(不可逆) |
| 方法 |
路径 |
权限 |
说明 |
| GET |
/api/batches |
batch:view |
批次列表 |
| PUT |
/api/batches/:id/archive |
batch:archive |
归档批次 |
| 方法 |
路径 |
权限 |
说明 |
| GET |
/api/templates |
template:view |
模板列表 |
| POST |
/api/templates |
template:create |
创建模板 |
| PUT |
/api/templates/:id |
template:update |
更新模板 |
| DELETE |
/api/templates/:id |
template:delete |
删除模板 |
| 方法 |
路径 |
权限 |
说明 |
| GET |
/api/users |
user:view |
用户列表 |
| POST |
/api/users |
user:create |
创建用户 |
| PUT |
/api/users/:id |
user:update |
更新用户 |
| PUT |
/api/users/:id/status |
user:update |
启用/禁用 |
| PUT |
/api/users/:id/roles |
user:assign_role |
分配角色 |
| DELETE |
/api/users/:id |
user:delete |
删除用户 |
| 方法 |
路径 |
权限 |
说明 |
| GET |
/api/roles |
role:view |
角色列表 |
| GET |
/api/roles/permissions |
role:view |
权限列表 |
| POST |
/api/roles |
role:create |
创建角色 |
| PUT |
/api/roles/:id |
role:update |
更新角色权限 |
| DELETE |
/api/roles/:id |
role:delete |
删除角色 |
| 方法 |
路径 |
权限 |
说明 |
| GET |
/api/audit/logs |
audit:view |
日志列表 |
| GET |
/api/audit/verify-chain |
audit:verify |
验证链式完整性 |
| 方法 |
路径 |
权限 |
说明 |
| GET |
/api/dashboard/stats |
dashboard:view |
统计数据 |
| GET |
/api/dashboard/trend |
dashboard:view |
趋势数据 |
| 变量 |
默认值 |
说明 |
NODE_ENV |
development |
运行环境 |
PORT |
3000 |
服务端口 |
JWT_SECRET |
- |
JWT 签名密钥(生产环境必填) |
JWT_ACCESS_EXPIRES |
15m |
访问令牌过期时间 |
JWT_REFRESH_EXPIRES |
7d |
刷新令牌过期时间 |
ENCRYPTION_ROOT_KEY |
- |
AES-256 加密根密钥(64 位十六进制,生产环境必填) |
CLIENT_URL |
http://localhost:5173 |
前端地址(CORS) |
DB_PATH |
./data/cdkey.db |
数据库文件路径 |
生产模式下 JWT_SECRET 和 ENCRYPTION_ROOT_KEY 必须设置且不能为默认值,否则服务拒绝启动。
| 权限 |
super_admin |
key_admin |
key_operator |
audit_viewer |
api_consumer |
regular_user |
| 看板 |
Y |
Y |
Y |
- |
- |
Y |
| 密钥查看 |
Y |
Y |
Y |
- |
- |
- |
| 密钥生成 |
Y |
Y |
Y |
- |
- |
- |
| 密钥冻结 |
Y |
Y |
- |
- |
- |
- |
| 密钥销毁 |
Y |
- |
- |
- |
- |
- |
| 密钥导出 |
Y |
Y |
- |
- |
- |
- |
| 批次管理 |
Y |
Y |
Y |
- |
- |
- |
| 模板管理 |
Y |
Y |
Y |
- |
- |
- |
| 用户管理 |
Y |
- |
- |
- |
- |
- |
| 角色管理 |
Y |
- |
- |
- |
- |
- |
| 审计日志 |
Y |
- |
- |
Y |
- |
- |
| 验证接口 |
Y |
Y |
- |
- |
Y |
- |
- 密钥存储 — 密钥原文经 AES-256-GCM 加密后存储,索引使用 SHA-256 哈希
- 密钥校验 — 每个密钥附带 HMAC 签名,验证时先校验完整性再检查状态
- 密钥生成 — 使用
crypto.randomBytes() + 模消除偏置算法,保证密码学安全
- 认证 — bcrypt 密码哈希 + JWT 双令牌(访问/刷新)+ 自动静默刷新
- 验证码 — SVG 图形验证码,带噪点干扰线,5 分钟有效期
- 限流 — 令牌桶算法,登录 5 次/15 分钟,验证 10 次/分钟
- 审计 — 链式 SHA-256 哈希,任何篡改可被检测
npm run dev # 开发模式(前后端同时启动)
npm run dev:server # 仅启动后端
npm run dev:client # 仅启动前端
npm run build # 构建生产版本
npm run build:server # 仅构建后端
npm run build:client # 仅构建前端
npm run start # 运行编译后的服务端
npm run db:init # 初始化/重置数据库
系统使用 SQLite(通过 sql.js WASM 引擎),数据库文件位于 server/data/cdkey.db。
共 12 张表:roles、permissions、role_permissions、users、user_roles、key_templates、batches、cd_keys、audit_logs、verify_requests、system_settings、encryption_keys。
sql.js 为内存数据库,进程退出时自动落盘。请勿在运行中直接操作 db 文件。
MIT