把散落的 AI 额度、账号密码、
服务器与凭证收进一个加密台账
Node.js + Express + SQLite,单个 db 文件即可迁移备份。API Key、密码、SSH 私钥全部用 AES-256-GCM 加密入库,页面只显示掩码,需要时逐字段解密。
「打开本地应用」需要先在本机执行 npm run init -- 密码 与 npm start,默认地址 http://127.0.0.1:3000。
Scope
四类资产,一套台账
AI RESOURCES
AI 资源
平台、接口地址、API Key、模型、总额度 / 已用 / 剩余、额度到期时间。剩余额度 ≤10% 自动标红。
ACCOUNTS
账号资产
平台、登录地址、账号、邮箱、密码、绑定手机、注册时间。密码加密存储,仅在需要时解密。
CLOUD & SERVERS
云 & 服务器
IDC / VPS / Cloudflare Pages / 域名 / DNS / 证书,含 IP、SSH 端口、登录账号、续费时间。
CREDENTIALS
其他凭证
订阅服务、会员、接口密钥。名称、关联账号、密钥、到期时间一屏可见。
分类筛选 & 模糊搜索
顶栏标签切换分类,搜索框同时匹配平台名称与备注,输入即筛。
到期提醒
已过期标红「已过期 N 天」,≤30 天(可配)标橙「剩余 N 天」,续费不再漏。
CSV 导出备份
支持脱敏导出与含明文密钥导出,带 UTF-8 BOM,Excel 打开中文不乱码。
Security
安全是这套系统的重点,不是附赠
- AES-256-GCM 加密:密码 / API Key / SSH 私钥 / 凭证密钥随机 IV + 认证标签,改密文必然解密失败。
- 管理员密码加盐哈希:scrypt(N=16384, r=8, p=1) + 16 字节随机盐,只存哈希,恒定时间比对。
- 全接口登录鉴权:未登录访问任何
/api/*返回 401,不泄露一条资产。
- XSS 防护:前端只用
textContent渲染,后端清洗控制字符,CSP 禁内联脚本。 - 会话安全:HMAC 签名 HttpOnly + SameSite=Strict Cookie,空闲 120 分钟过期,重启即失效。
- 日志脱敏:只记录方法、路径、状态码与耗时,绝不打印密钥与密码。
| 风险点 | 处理方式 |
|---|---|
| 明文存储敏感字段 | 入库前 AES-256-GCM 加密,库内形如 enc:v1:<base64>,列表接口只返回掩码 |
| 传输过程暴露 | 仅监听 127.0.0.1;明文走独立接口且响应 no-store;可反代 HTTPS 并开 COOKIE_SECURE=1 |
| 暴力破解登录 | 同 IP 10 分钟内 5 次失败锁定 10 分钟 |
| CSRF | SameSite=Strict + 写操作 Origin/Referer 同源校验 |
| 参数注入 / 超长 | 字段白名单 + 类型、长度、日期格式、枚举校验,未声明字段直接丢弃 |
| 配置文件外泄 | .env、data/、*.db、*.csv 全部在 .gitignore 中 |
Quick start
三步跑起来
# 1. 安装依赖(仅 express) npm install # 2. 生成 AES_KEY / SESSION_SECRET 并设管理员密码 npm run init -- 你的管理员密码 # 3. 启动 npm start # → http://127.0.0.1:3000
环境要求
Node.js ≥ 22.5(使用内置 node:sqlite,无需编译原生模块;低版本会自动回退 better-sqlite3)。
备份
停服后复制 data/assets.db 即完成备份;换机时连同 .env 一起拷贝,npm install && npm start 即可恢复。
注意
AES_KEY 丢失 = 已加密数据永久无法解密,请与数据库分开另存。
Structure
项目结构
server.js 入口:安全响应头、请求日志、路由挂载、启动自检
src/
env.js 极简 .env 加载器(不依赖 dotenv)
crypto.js AES-256-GCM 加解密
auth.js scrypt 密码哈希 + 签名 Cookie 会话
db.js SQLite 初始化与建表
schema.js 四类资产字段定义(前后端唯一来源)
validate.js 输入校验、清洗、字段白名单
routes/auth.js 登录 / 登出 / 会话状态(含失败限流)
routes/assets.js CRUD + 搜索 + 单字段解密 + CSV 导出
public/ index.html · login.html · app.js · login.js · style.css
scripts/set-password.js 生成密钥与密码哈希写入 .env
docs/index.html 本介绍页(GitHub Pages)
data/assets.db 单文件数据库(首次启动自动创建,不入库)