推荐一款我开源的「零知识」密码管理器 Password

夕梦
2026-08-31 142 阅读 0 评论
开源分享# Vue.js# Docker

密码管理器 Password

主密码加密、服务端只存密文、跨设备同步、还支持飞牛 fnOS 一键安装。 项目地址:https://gitee.com/ximengsr/password​


为什么要写这个工具

账号密码越攒越多,浏览器自带的密码填充经常不够用,而把账号明文丢在备忘录里又总觉得不踏实。市面上的密码管理器要么收费、要么要把数据交给第三方服务器。

灵感来源是 Utools 中的 Password 插件,但是 Utools 不开会员没办法同步数据

于是我做了一个自己的:Password(密码管家)——一个本地优先、零知识架构的轻量密码管理器。它最大的特点是:服务端只保存密文,没有主密码谁都解不开,包括我在内部署的你自己的那一份。

它是什么

Password 是一个基于 Vue 3 + Node 的零知识密码管理器:

  • 账号内容在你本地用 AES-256-CBC 加密后才上传;
  • 服务端只保存密文、无法解密,即使数据库泄露也还原不出任何账号;
  • 可单机部署,也能容器化后跑在 NAS / 服务器上,实现多端共享。

一句话总结:你的主密码就是钥匙,钥匙只在你脑子里和内存里,从不下发、从不落盘。


核心亮点

1.零知识存储

账号字段经 AES-256-CBC 加密,密钥由主密码派生且仅存在于内存;服务端只保存密文,无主密码则不可解密。

2.跨设备同步

服务端 SQLite 作为权威真源,系统全局只有一个密码本。所有设备访问同一后端即共享同一套加密账号库,前端双向同步。

3.离线优先

后端不可达时,若本机已有解锁记录,仍可新建分组与账号(先写入浏览器 IndexedDB,恢复连接后自动同步);首次创建密码本需连接后端。

4.会话安全

  • 刷新不闪解锁页、记住登录(1 天免输);
  • 空闲自动锁定;
  • 本地解锁用 BCrypt 校验。

5.极简部署

后端基于 Node 内置 node:sqlite(零原生编译),生产环境单进程同时托管前端静态页面与 /api,也支持 Docker。

​


技术架构

层 选型
前端 Vue 3(<script setup>)+ Vite + Pinia + Vue Router + LESS
加密 crypto-js(AES-256-CBC / MD5)+ bcryptjs(BCrypt / PBKDF2 派生鉴权串)
后端 Node + Express
存储 SQLite(Node 内置 node:sqlite),单一密码本(固定 vault 标识),WAL 模式

数据存储采用零知识双层存储,服务端 SQLite 与浏览器 IndexedDB 均为加密密文:

位置 存储内容 作用
SQLite(权威真源) 全部加密文档 + 密码本锁 bcryptpass 跨设备同步的源、全局唯一密码本
IndexedDB(本地缓存 + 本地锁) 同样的加密文档缓存 + 本地 bcryptpass 离线可用、刷新不丢、本地解锁

两者通过前端双向同步:服务端空 + 浏览器有 → 推上去;浏览器空 + 服务端有 → 拉下来。


部署方式

方式一:本地单机 (最简)

适合内网、单机、自托管,一个进程同时提供页面与接口:

bash
npm install --prefix server
npm install --prefix web
npm run build --prefix web      # 必须先构建前端
npm run start --prefix server   # 访问 http://localhost:3000

方式二:Docker 部署 推荐服务器 / NAS

已发布预构建多架构镜像 ximengs/password(amd64 + arm64),无需本地构建,直接拉取运行:

yaml
services:
  password:
    image: ximengs/password:latest
    container_name: password
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - password-data:/app/server/data

volumes:
  password-data:
bash
docker compose up -d

方式三:公网 / 反向代理 (务必启用 HTTPS)

鉴权令牌经请求头明文传输,必须启用 HTTPS 终止 TLS,并让前端与 /api 同源部署,避免跨域。


飞牛 fnOS 应用安装(重点)

如果你在用飞牛 fnOS 私有云,那就更省事了——项目内置了飞牛第三方应用包(fnnas/ 目录),可直接打包成 .fpk 在飞牛应用中心安装,无需敲命令。

应用包本身不修改程序,它引用已发布的 Docker 镜像 ximengs/password:latest(多架构 amd64 / arm64 自动适配),安装后通过桌面图标以 iframe 打开 3000 端口即可使用。

打包与安装步骤:

  1. 安装飞牛官方打包工具 fnpack(见 https://developer.fnnas.com/docs/cli/fnpack/):
bash
# macOS Apple Silicon 示例
curl -LO https://.../fnpack-1.2.3-darwin-arm64
chmod +x fnpack-1.2.3-darwin-arm64
sudo mv fnpack-1.2.3-darwin-arm64 /usr/local/bin/fnpack
  1. 在本目录执行打包:
bash
cd fnnas
fnpack build
  1. 产物 password.fpk 可在飞牛 fnOS 设备通过应用中心后台上传,或 appcenter-cli install-fpk password.fpk 安装。

提示:fnnas/ 中的 ICON.PNG、ICON_256.PNG 等为占位图标,打包前记得替换为真实应用图标。

​

数据持久化方面,数据库挂载到 ${TRIM_PKGVAR}/data(容器内 /app/server/data),卸载应用包时请留意运行时数据目录是否被清理。


数据安全

  1. 主密码经 BCrypt 哈希用于本地解锁;服务端鉴权采用固定盐的确定性 deriveAuthHash(PBKDF2),仅做等值比对。
  2. 账号字段经 AES-256-CBC 加密,密钥由主密码派生,仅存在于内存,从不落盘。
  3. 无主密码则无法推出密钥,所有密文不可解密(零知识)。

注意:应用为「单一密码本」模型,一个运行实例仅对应一个密码本。请让每位使用者独立部署实例,勿在同一实例上多人共用。


项目地址与许可

  • 项目地址:https://gitee.com/ximengsr/password
  • 许可证:MIT(可自由使用、修改、再分发,仅保留版权声明)
  • 镜像:ximengs/password(Docker Hub,多架构)

如果你也在找一个数据真正掌握在自己手里的密码管理器,欢迎试用、提 Issue 或 Star 支持一下。有问题也欢迎在仓库讨论区交流。

​

​