基于KeeWeb的个人密码管理系统

前一阵子bzoj发来邮件说我的账户在多个位置登录。顿时感觉之前的密码不是很可靠了。不过我也记不住那么多密码。于是思考能否有一个个人的密码数据库,每个网站的密码独立不同,全部随机生成。

然后看起来已经有大量解决方案了。
商业的解决方案有很多。如1Password,LastPass,Enpass等。不开源,解锁限制要花钱,没有网页端,不能自己搭这点违背了我们折腾的本质啊。。
不过没法否认他们做得很好。

开源的选择就少了。padlock有点简陋,passbolt好像侧重团队使用(功能也少)。
比较成熟的是Keepass。

keepass包含一个桌面端,也蕴含一个存密码的数据库文件(kdbx)的标准。好多开源的第三方客户端。有个keepass2android还是比较好看,不过感觉好多功能还没支持。
keepass2web也是个web端,不过长久没人维护了,而且是perl写的,不会改。

最棒的就是keeweb了。

keeweb是一个基于js的静态html网站,通过文件读写、webdav等api和localstorage等科技,做得和本地应用一样了。可以自己host一份在网站上。
可以本地化,支持中文。
支持TOTP(这个很可以)。
支持断网访问。

使用了grunt,可以自己改造然后重新build。
折腾了一个星期,基本让它运行起来了。

折腾记录

https://github.com/keeweb/keeweb
首先在ide里clone一份。

然后根目录下

npm install

然后

npm install -g grunt-cli

测试编译:

grunt

会编译到dist/下。

然后怎么快速部署上线呢。。
没找到很好的办法。不过ide支持文件夹打包下载,而且地址不变。所以可以在ssh里wget下来然后unzip。

rm -r *
wget https://..../vfs/1/..../workspace/keeweb/keeweb/dist/?download=dist.zip --http-user=... --http-passwd=...
mv index.html\?download\=dist.zip dist.zip
unzip dist.zip
cp dist/* . -r

把命令复制下来,在shell里一贴,自动完成所有操作,很爽。

然后发现根本连不上我的webdav。
控制台里说是cors的问题——我的nextcloud和keeweb不在一个域名下。
折腾半天痛定思痛,在nginx里强行在这个域下反代了一个文件夹到nextcloud的webdav地址。

然后连上了。保存不了。
keeweb提供两种保存方式:

  1. 上传成临时文件再move覆盖
  2. 直接put覆盖原文件
    然后第二种没问题,第一种不行。显示403。还报错地址不对。

然后折腾了得有几个小时。

最后发现,webdav协议的move的用法是 MOVE [源文件],目标位置写在http头的Destination头里。然后nginx显然只是改了前者,而没有rewrite后者。
并不会让nginx改。
痛定思痛,把webdav相对地址改成和nextcloud一样的,临时解决。
然而,后来发现不需要用第一种,用第二种就好了。nextcloud有版本控制。

改了改代码,把默认的主题和字体大小换了,默认的保存方式也换了。暂时还不知道如何自动保存。就手动保存吧。

于是上线使用了。