MENU

KeePass 2 开源密码管理工具

• 2023 年 05 月 25 日 • 阅读: 172 • 写点笔记

KeePass 2 开源密码管理工具


官网

https://keepass.info/

为什么写此篇文档

为了将如此功能强大的软件分享给更多人,但网上铺天盖地的教程文档大多数都是搬运SMZDM上的文章 (ps:原文写的确实好),笔者在使用多年后总结了一些坑和小技巧,同时也为了便于笔者自己日后装机时折腾起来更方便,记录下此篇文档。

本文后续会持续更新,各位读者如有建议或经验见解也请留言讨论。

我们为什么要是使用密码管理工具?

  • 我们需要在各个网站、平台、数据库、服务器等地方设置密码,很多人的习惯是使用相同、简单、有规律的密码,简单有规律的密码会导致你的账号很容易被暴力破解,相同的密码会受撞库攻击的影响。因此最安全的策略是每个网站使用不同的、纯随机的密码,然而这就会导致我们记不住任何一串密码,此时一个安全的密码管理工具就可以解决这些痛点。

为什么选择 KeePass 2?

  • 市面上有很多种密码管理工具,而笔者最关注以下需求:

    • 安全性(重中之重)
    • 开源
    • 免费或一次性买断制收费
    • 纯本地离线或支持自建服务端
    • 跨平台
    • 支持自动填充
    • 支持两步验证SSH Agent
  • 经过筛选之后就剩下KeePass 2和它的衍生KeePassXC可以满足需求,并且还支持双通道自动输入混淆以及内存保护等功能来提高安全性。那么这两者有什么区别呢?前者的优点是插件扩展性强,可自定义选项更多,而后者则有着界面美观、人性化功能更多、开箱即用的优势。
  • 经过反复比较,笔者发现截至2023-05KeePassXC在以下方面还是存在明显问题:

    • 如果你的数据库中存入了多个SSH密钥,在使用SSH Agent功能时并没有提供一个可选的密钥列表,而是由终端程序去挨个尝试,这就会触发服务端设定的最大重试次数限制,导致此功能几乎处于不可用状态。
    • 如果勾选了最小化程序后自动锁定数据库,同时又使用了Windows Hello解锁,此时由浏览器插件发起解锁数据库请求,解锁后的程序界面默认是最小化的,但程序逻辑却错误地再次将数据库锁定,属实是混乱
  • 综上所述,笔者目前更推荐使用KeePass 2 2.53.2及以上版本(已知的安全漏洞全被修复)搭配各种插件作为主力密码管理工具,如果读者有其他更推荐的解决方案也欢迎留言补充。

推荐的手机APP

使用和设置

一些概念

  • 数据库:一个密码仓库,包含多个群组(密码本),数据(用户名、密码、网站组成的一个对象)
  • 数据库密码:整个仓库的主密码
  • 密钥文件:和密码一起存在才能解锁数据库,一般不建议和数据库文件存储在同一个目录,最好能隐藏起来或者放在移动设备中(但实际使用不现实,在能力范围内尽量保护好吧)

一些坑

  • unix系安装时不建议使用wine+windows版的模式,此模式无法正常调用部分系统API
  • 不建议使用Windows账户作为数据库加密方式
  • 推荐使用移动版程序

汉化

  • 打开官方的翻译页面,下载语言文件放置于程序安装目录的Languages目录下
  • 打开程序,选择菜单栏 View -> Change Language,选择简体中文并重启软件

自定义翻译

  • 打开官方的翻译页面,找到页面最下方的翻译工具下载地址,下载后打开已有的翻译文件,即可在原有基础上定制自己的翻译内容
  • 请自觉尊重并保护原译者的版权信息,不要恶意盗用他人的翻译成果,若想对翻译工作做出贡献请联系原译者

触发器

  • KeePass 2 自带了一套功能强大的触发器系统,可以实现一些脚本化功能,但由于触发器是作用于程序维度而不是数据库维度,因此触发器的规则是明文存储在配置文件中的,不建议在触发器中存储密码、密钥文件位置等关键信息

设置WebDav/FTP同步数据库

  • 目前同步有两种方式

    • 1:本地数据库 + 触发器 实现每次保存本地数据库后同步一次远程数据库
    • 2:直接打开远程数据库进行操作
  • 方式二简单粗暴,且移动端程序想使用同步数据库,一般都是使用方式二,但方式二的致命缺陷是离线状态下无法打开数据库,而方式一由于本地也维护了一份数据库,因此可以在离线情况下正常工作,待联网后即可再次保存数据库触发同步(手机客户端一般会在本地缓存一份数据库,实际采用的还是方式一)。
  • 更进一步,本文推荐的方式是

    • 使用程序自带的触发器功能,通过 WebDav 协议同步一个数据库到本地,每次程序读取次文件
    • 云端另一个目录/同步服务,存放一个备份数据库且默认不同步到本地,每次程序保存时同步一次备份数据库,实现双端备份
    • 可选:通过插件实现每次保存数据库后保留一个历史版本到一个历史备份目录,实现自定义版本控制,本文后续会介绍
  • 这里以坚果云 WebDav方式为例,首先你需要注册登录坚果云账户,创建一个同步目录,这里命名为 KeePass_Sync,并将你的数据库文件提前上传到此目录
  • 在坚果云安全选项中的第三方应用管理下方点击添加应用,名称自定如KeePass,然后点击生成密码,此时应用添加完成,复制一下生成的密码。
  • KeePass 2中新建一条数据记录坚果云WebDav备份,可以使用自带的用户名、密码等字段,也可以新建自定义字符串字段,以下两种方式二选一即可

    • 采用默认字段方式,将连接信息存入用户名密码网址(https://dav.jianguoyun.com/dav/KeePass_Sync/你的数据库.kdbx)三个字段,并且需要复制此条记录的UUID(属性选项卡-UUID逗号前面的部分),后续会用到
    • (不推荐)如果采用自定义字段,注意自定义字符串名称不能与其他记录中任何一个自定义字符串相同,这里我们将字段命名为:KeePass云备份路径(https://dav.jianguoyun.com/dav/KeePass_Sync/你的数据库.kdbx)WebDAV用户名WebDAV密码_KeePass,后续会用到

设置触发器

  • 利用触发器实现:每次保存本地数据库时,检查远程服务器是否在线,若在线就通过 WebDav 与远程数据库同步来实现远程备份,接下来是具体操作

    • 运行程序,点击菜单栏的工具-触发器
    • 在弹出的触发器列表窗口中点击添加
    • 输入名称,这里以小明的数据库1_同步触发器A为例,下方的启用启动时打开默认勾选,只执行一次不勾选
    • 来到事件选项卡,点击添加事件,选择已保存数据库文件,下面的条件设置为包含、并输入kdbx
    • 接下来打开条件选项卡

      • 新建一条条件,选择远程主机可以链接,并输入你的同步服务器域名,不带协议(不带http://
      • 再新建另一个条件,条件选择字串,字串值为{DB_BASENAME}(代表数据库名称的表达式),并根据实际情况设置具体条件(比如你有两个数据库 1A2B,你可以通过配置比较:结尾值:B比较:等于值:2B来实现对2B的匹配)
    • 最后来到动作选项卡,这里共需建立三条动作

      • 第一条,选择更改触发器 开/关 状态,名称为小明的数据库1_同步触发器A,新状态为关闭
      • 第二条,选择与一个 文件/网址 同步当前数据库,文件地址可为本地地址或远程地址,并输入对应的用户名密码,但是需要注意这里的数据是明文存储在配置文件中的,为了安全考虑最好使用引用数据记录的方式,就需要用到我们刚刚新建的记录

        • 如果采用默认字段方式,这里我们需要在对应输入框内输入{REF:A@I:刚刚获取的UUID}{REF:U@I:刚刚获取的UUID}{REF:P@I:刚刚获取的UUID}
        • (不推荐)如果采用的是自定义字段方式,我们只需要在对应输入框内输入{S:KeePass云备份路径}{S:WebDAV用户名}{S:WebDAV密码_KeePass}即可
      • 第三条,依然选择更改触发器 开/关 状态,名称为小明的数据库1_同步触发器A,此时新状态为开启
      • 这里需要先关闭此触发器->执行同步->再开启触发器,主要是为了防止同步操作也被认定为保存数据库,再次触发此触发器,造成死循环
    • 要注意的是事件条件的共同的和区别是:需要发生对应的事件,才能进入条件判断,通过后才能执行动作,且事件是列表中任意一个事件发生即可触发,而条件则是列表中全部条件都满足时才能通过
    • 触发器窗口的工具按钮自带了从剪贴板导入/导出触发器功能,本文中介绍的触发器会放于附表-触发器中,触发器保存在配置文件的<Tiggers>标签中
    • 全部设置完毕后保存触发器,并尝试编辑数据库看是否能成功同步,KeePass 2 的触发器能实现的功能还有很多,若有兴趣可多多尝试

运行时打开多个数据库文件

  • 依然通过触发器方式,创建一个在程序启动后触发的事件,动作为解锁另一个数据库即可,注意这里的路径、密码、密钥文件等关键信息最好也存储于一个已解锁数据库中;如果有同时使用多个数据库的需求,我们可以先建立一个控制用数据库,将其他数据库的信息存储其中,通过触发器依次解锁即可。

配置文件

  • 安装版程序配置文件位置: C:\Users(用户)\User Name\AppData\Roaming\KeePass\KeePass.config.xmlenforced 配置文件依然放置于安装目录下)
  • 移动版程序配置文件位置:安装目录下的KeePass.config.xml文件

使用固定设置(配置文件只读)

  • 将程序和插件按照想要的功能调校好,之后关闭程序进程
  • 进入安装目录,找到 KeePass.config.xml 并将其改名为 KeePass.config.enforced.xml 即可
  • 之后每次运行时程序会根据此文件生成临时配置文件,每次在程序中修改设置都只会在当次运行时生效,而不会写入此 enforced 配置文件,可对此文件进行备份或同步

推荐的配置

  • 安全选项卡推荐勾选以下选项

    • 最小化主窗口至任务栏时锁定
    • 最小化主窗口至托盘时锁定
    • 退出 KeePass 时清空剪切板
    • 不在 windows 剪贴板历史记录和云剪贴板存储数据
    • 使用“剪贴板查看器防护” 格式 保护剪贴板
    • 使用本地库以加快密匙转换
    • 在安全桌面输入管理密钥
    • 在使用一次后,清除管理密钥命令行参数
    • 数据库处于打开状态时,记住其管理密码(以加密方式)
  • 界面一选项卡

    • 最小化到系统托盘(而不是任务栏)
    • 锁定后最小化主窗口
    • 关闭 按钮[X]最小化主窗口,而不是退出程序
  • 高级选项卡

    • 启动时自动打开上次使用的数据库
    • 只允许运行一个 KeePass 进程
    • 启动时最小化并锁定
    • 退出和锁定数据库时自动保存
    • 总是显示全局自动输入记录选取对话框
    • 取消勾选 记住密钥源(密钥文件路径、提供者名称等...)
    • 取消勾选 自动搜索密匙文件

插件

  • KeePass 2有着强大的插件支持,以实现各种自定义功能,插件通常是以plgx结尾的文件,下载插件后放置于主程序的Plugins目录下(在程序主界面中点击工具插件管理器打开文件夹),重启主程序即可使用插件,官方插件汇总页面,以下是本文推荐的一些功能插件
  • 注意,在Linux系统中,某些插件依赖mono-complete package,请先安装此包

IOProtocolExt 支持更多网络协议

-地址

  • 可以使用更多网络协议(SCP, SFTP, FTPS)来请求远程数据库
  • 如果你的操作系统不支持.NET编写的FTP客户端功能,也尝试此插件重写的FTP客户端功能

KeeTheme 黑色主题

  • 地址
  • 支持暗色主题、跟随系统自动调整颜色等功能

KPEnhancedEntryView 增强记录视图

  • 地址
  • 提供信息更丰富的界面视图,减少操作提高可用性
  • 使用此插件,推荐设置显示-窗口布局-平铺显示-列设置-只保留标题,其他全部取消勾选

AutoTypeSearch 自动输入窗口提供搜索功能

  • 地址
  • 当自动输入功能没有匹配到你想要的数据,可以使用此插件来进行数据搜索来触发自动输入

KPEntryTemplates 数据模板

  • 地址
  • 可以让你管理一套数据模板,以便在新建类似数据时快速填充默认内容,或新建固定字符串字段

KPSimpleBackup 自动备份数据库

  • 地址
  • 可以实现每次保存数据库后在指定目录输出一份备份,可设置保留多个历史版本并滚动更新

KeePassQRCodeView 二维码展示字段

  • 地址
  • 可以为密码数据的每个字段生成明文二维码,便于复制到移动端,省去复制密码到微信的步骤

QuickUnlock 快速解锁

  • 地址
  • 当程序启动并且第一次成功解锁数据库后,后续每次自动锁定之后再次输入完整密码是不是很麻烦?此插件可以建立一个短密码来进行快速解锁
  • 安装此插件之后需要在数据库的根群组路径中建立一条名为QuickUnlock的数据,这条数据的密码即为快速解锁密码

Windows Hello 集成

  • 类似于前面提到的短密码快速解锁,如果你的设备支持Windows Hello,也可以使用插件调用生物识别设备来解锁
  • 这里提供两款插件可选 KeePassWinHelloWinHelloUnlock,前者最新更新于2021年,后者在前者基础上修改了数据存储位置并实现了每次启动程序后不需要输入密码就可以调用Windows Hello进行解锁,但出于安全考虑(后者作者自谦承认代码水平一般),如果没有严重bug出现还是更推荐前者

YetAnotherFaviconDownloader 又一个图标下载器

  • 地址
  • KeePass 2的每一个群组、每一条数据可以自定义一个图标,此插件可以读取数据配置的Url地址,下载网站的图标文件,并设置为这条数据的图标

ExeIconPicker 从EXE文件读取图标

  • 地址
  • 这个不用过多介绍,见名知意

ColoredPassword 字符颜色区分

  • 地址
  • KeePass 2中的密码框中所有字符统一为黑色/白色,此插件主要功能是自定义每种字符(例如大写字母、小写字母、数字、符号)的显示颜色,便于直观鉴别密码复杂度

EarlyUpdateCheck 更强大的更新监测

  • 地址
  • KeePass 2自带更新监测功能,但此功能无法实现自动下载新版程序、自动更新插件等功能,此插件就是为了弥补这些遗憾而存在(甚至能查找插件是否有汉化并下载,但如果插件官网被墙则无法工作)
  • 此插件需在KeePass 2 中开启启动程序后自动检查更新启动程序后自动解锁最近使用的数据库两项设置
  • 本文推荐关闭此插件设置中的 前台显示更新 选项以实现静默检测(有更新会提示你操作,不用担心它会自作主张的静默更新)

KPSourceForgeUpdateChecker 增加SourceForget插件数据源

  • 地址
  • 原有更新程序只支持从官网查询插件版本,此插件可以支持SourceForget数据源

PasswordChangeAssistant 密码修改助手

  • 地址
  • KeePass 2自带的密码生成规则,默认是存放于配置文件中,此插件可将配置文件中的规则转移到数据库文件中,更方便多端同步

PEDCalc 密码过期日历

  • 地址
  • KeePass 2自带了密码过期功能,即一条密码使用一段时间后显示为已过期,提醒用户及时修改密码,但是自带功能一次只能修改一条密码,且过期的密码修改后无法自动重置有效期,此插件弥补了以上遗憾,可实现多选修改过期时间、状态、有效期重置等功能

KeePassNatMsg 网络消息接口

  • 地址配套的浏览器插件KeePassXC-Browser官网
  • 谷歌浏览器插件Firefox插件Edge插件
  • 当我们正常使用KeePass 2时,需要手动呼出密码菜单,选择对应的密码再执行输入,此插件则实现了当你打开一个网站时,浏览器插件会以安全加密协议调用程序接口,程序在后台自动寻找此网站可用的密码数据并直接显示在浏览器页面上,非常方便
  • 此插件前身是大名鼎鼎的KeePassHttp,但后者由于存在安全隐患,已不推荐使用
  • 此插件基于Native Message,使用时需要在插件设置中安装浏览器对应的服务端程序,使用方式为 工具→KeePassNatMsg Options→Install/Update Native Messaging Host,并勾选你需要安装服务端的浏览器,点击确定等待弹出成功提示(下载服务可能被墙)
  • 插件服务端正常启动后,需在浏览器安装KeePassXC-Browser插件,安装后点击浏览器插件图标,并且点击连接数据库后,程序会弹出认证提示,你需要给此浏览器起一个简单好记的别名,之后即可正常使用
  • 需要注意,若KeePass 2主程序是使用的安装版且安装在了C:/Progarm Files目录下,就必须使用管理员模式运行,但此插件目前不兼容管理员模式,因此建议使用解压版主程序
  • 若在下载服务端时由于网络问题造成下载不完整,可以手动清理下载文件并重新下载,目录位置C:\Users\%Username%\AppData\Local\KeePassNatMsg

KeeResize 调整窗口尺寸

  • 地址
  • 官方制作的插件,免费版可实现数据编辑页面可调整尺寸,收费版可实现全部页面可调整尺寸,具体见官网

CheckPasswordBox 检查密码输入框

  • 地址
  • 提供了新的自动输入占位符{PASSWORDBOX},用来定位属性为密码的页面输入框,防止输错位置

KeeAgent 强大的SSH Agent

  • 地址Github
  • 要了解此插件,首先你需要了解SSH key)是什么
  • 此插件可以将SSH Key公、私钥文件存储在数据库中,并通过模拟Pageant代理来接管系统调用密码的所有请求,不需要将密钥保存于本地即可进行验证,同时支持 PuTTYOpenSSH 格式的私钥,而且支持 Windows / Linux / Mac
  • 安装插件后进入主程序工具→选项→KeeAgent,建议勾选全部选项,并根据提示生成CygwinmsysGitWSL 1代理文件方便在Git等第三方工具中使用,需要在系统环境变量中配置SSH_AUTH_SOCK,变量值为代理文件路径
  • 由于此插件实现的监听方式是在随机TCP端口上注册Socket代理,且当前版本KeeAgent v0.12.1只注册了127.0.0.1地址,因此截止2023-05-25目前无法原生支持WSL 2,目前可以通过第三方代理[wsl-ssh-agent
    ](https://github.com/rupor-github/wsl-ssh-agent)的方式实现(教程),但由于侵入性较高,若非紧急需求,笔者并不推荐此方式,当前KeeAgent作者有计划适配WSL 2,建议等待插件更新

Url In Title 将地址显示于标题栏浏览器插件

  • Chrome, Firefox
  • 可以将网站的地址显示于标题栏,提高密码匹配效率

KeeTrayTOTP 两步验证器

  • 地址
  • 很多网站都提供了两步验证功能,之前都是用谷歌或微软提供的两步验证APP进行存储,使用此插件可以在数据库中实时生成两步验证密钥
  • 两步验证的原理是根据一串密钥和当前的时间生成一段临时密码,一般每30秒会变更一次,因此只要拿到密钥即可,一般网站在配置两步验证时都会提供密钥或二维码,使用手机扫码后即可复制密钥
  • KeePass 2程序中对任意数据点击右键-Tray TOTP Plugin-Setup TOTP来进行设置,在弹出窗口中填写密钥、刷新时间、生成位数(网站没有特殊要求就不需要修改时间和位数),点击保存即可
  • KeePass 2程序中刚刚操作的数据点击右键-Tray TOTP Plugin-Copy TOTP即可复制实时生成的临时密码到剪切板

获取Steam两步验证密钥

  • Steam官方只允许使用手机客户端来进行两步验证,并不提供密钥,但是我们可以通过以下两种办法获取到密钥

    • 通过WinAuthAuthenticatorPro等第三方开源验证器获取密钥,操作方法大同小异,都是先模拟Steam手机端来绑定两步验证令牌,再进行数据导出至一个配置文件,密钥就存储在配置文件中
    • 如果你有已经Root的安卓手机,也可以下载并安装Steam手机客户端,设置好Steam令牌,打开目录:/data/data/com.valvesoftware.android.steam.community/files/,将目录中的Steamguard文件以文本方式打开,其中secret=后面直到第一个&符号之前的字符串即为密钥

附表

触发器列表

WebDav同步触发器

<?xml version="1.0" encoding="utf-8"?>
<TriggerCollection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Triggers>
        <Trigger>
            <Guid>IqeTtS3AkU2o2XV+0nzf/g==</Guid>
            <Name>这里自定义触发器名</Name>
            <Events>
                <Event>
                    <TypeGuid>s6j9/ngTSmqcXdW6hDqbjg==</TypeGuid>
                    <Parameters>
                        <Parameter>1</Parameter>
                        <Parameter>kdbx</Parameter>
                    </Parameters>
                </Event>
            </Events>
            <Conditions>
                <Condition>
                    <TypeGuid>KiKDqJ0TQeiZh4usIY2B9A==</TypeGuid>
                    <Parameters>
                        <Parameter>dav.jianguoyun.com</Parameter>
                    </Parameters>
                    <Negate>false</Negate>
                </Condition>
                <Condition>
                    <TypeGuid>uQ/4B3M4T+q7LrwL6juYww==</TypeGuid>
                    <Parameters>
                        <Parameter>{DB_BASENAME}</Parameter>
                        <Parameter>0</Parameter>
                        <Parameter>这里填数据库名,只有保存对应的数据库时才会同步</Parameter>
                    </Parameters>
                    <Negate>false</Negate>
                </Condition>
            </Conditions>
            <Actions>
                <Action>
                    <TypeGuid>tkamn96US7mbrjykfswQ6g==</TypeGuid>
                    <Parameters>
                        <Parameter>这里自定义触发器名</Parameter>
                        <Parameter>0</Parameter>
                    </Parameters>
                </Action>
                <Action>
                    <TypeGuid>Iq135Bd4Tu2ZtFcdArOtTQ==</TypeGuid>
                    <Parameters>
                      <Parameter>{REF:A@I:这里写UUID}</Parameter>
                      <Parameter>{REF:U@I:这里写UUID}</Parameter>
                      <Parameter>{REF:P@I:这里写UUID}</Parameter>
                    </Parameters>
                </Action>
                <Action>
                    <TypeGuid>tkamn96US7mbrjykfswQ6g==</TypeGuid>
                    <Parameters>
                        <Parameter>这里自定义触发器名</Parameter>
                        <Parameter>1</Parameter>
                    </Parameters>
                </Action>
            </Actions>
        </Trigger>
    </Triggers>
</TriggerCollection>

结语

本文部分内容整理自互联网,感谢各位文章作者的无私奉献,感谢精灵宝可梦的插件推荐文章

感谢KeePass 2开发团队

本文未提及出处部分皆为原创,未经允许请勿转载

最后编辑于: 2023 年 05 月 28 日