hankit/keepassphp

PHP 解析 .kdbx 文件的库

dev-master 2021-03-15 22:50 UTC

This package is auto-updated.

Last update: 2024-09-16 06:22:54 UTC


README

KeePassPHP 是一个纯 PHP 库,可以读取由密码管理器 KeePass 2.x 生成的密码数据库(.kdbx 文件)。它可以读取组、条目和密码,并通过简单的 PHP API 轻松访问。它的目标(目前)并不是完全替代 KeePass:它不能修改 kdbx 文件,只能读取它们。

更普遍地,KeePassPHP 也可以以与 KeePass 相同的安全方式加密和解密文件(带有完整性检查、暴力破解保护等)。

示例

查看 KeePassPHP-UI,这是一个直接使用 KeePassPHP 列出 kdbx 文件所有条目的网络用户界面,并且可以在需要时提取选定的特定密码。否则,文件 keepassphp-cli.php 是 KeePassPHP 的命令行界面,也展示了如何使用此库提供的几乎所有功能。

库用法

KeePassPHP 可以在两个级别上使用。

在低级别上,KeePassPHP 提供了一个 API 来以与 KeePass 相同的安全格式解密和加密内容。此内容可以是 XML 格式的 KeePass 密码数据库,也可以是任何其他类型的数据。因此,KeePassPHP 可以用作简单而强大的文件加密/解密库。它还提供了一个 API,以树的形式读取 kdbx 密码数据库内容作为 PHP 对象,提供对 kdbx 文件中存储的每个条目的简单且自然的访问。

在高级别上,KeePassPHP 可以存储与唯一 ID 关联的 kdbx 文件。这样,许多用户可以轻松存储和访问他们的密码数据库,只需他们的 ID 和密码即可。当以这种方式使用时,KeePassPHP 将数据内部存储在“kphpdb”文件中,以将每个 ID 与 kdbx 文件和可能的密钥文件关联起来,以及可能的其他数据,以加快用户访问其 kdbx 文件条目列表的速度(见下文)。

内部 kphpdb 文件

解密 kdbx 文件在计算上非常昂贵。实际上,为了防止攻击者通过暴力攻击猜出你的主密码,KeePass 会重复加密该密码多次,从而使整个解密过程人为地变得困难。因此,通过暴力破解找到密码会花费很长时间。

但鉴于 PHP 可能相当慢,仅解密一次 kdbx 文件实际上可能需要很长时间。此外,你可能需要两次解密单个数据库才能找到密码:第一次是为了获取所有条目的列表并将其显示给用户,第二次是为了实际获取选定的密码(这正是 KeePassPHP-UI 发生的情况)。

为了解决这个问题,KeePassPHP 可以从 kdbx 文件中提取条目数据的一个子集,但不包括密码。然后,将此提取的、不太敏感的信息再次加密并存储在与实际 kdbx 文件一起的所谓 kphpdb 文件中。kphpdb 文件与 kdbx 文件加密方式相同,但加密轮数较少,因此解密速度更快。使用此系统,访问不带密码的条目列表速度快;但获取密码仍然与之前一样困难。如果有的话,kphpdb 文件还用于存储与 kdbx 文件关联的密钥文件。

安全关注点

首先,如果您在通过互联网访问的服务器上使用 KeePassPHP,显然需要保护与该服务器的通信管道的安全性,因为您的密码将在这个管道中来回发送。因此,您始终需要使用 https 来访问 KeePassPHP。

然后,由于您的密码数据库将存储在那个服务器上,因此很难攻破该服务器并获取kdbx文件本身。理想情况下,应该像在您的计算机上(或者您的kdbx文件存储的地方,比如您的手机、Dropbox账户等)一样难以做到。现在,如果您的服务器配置正确,这实际上应该是可以的。

另一个需要警惕的安全问题是,当您在非自己的设备上访问KeePassPHP时(这通常是您可能使用的KeePassPHP的类型),您永远不知道您能有多信任该设备。它可能有键盘记录器可以窃取您的主密码,它可以记录您可能会复制到剪贴板中的密码等。永远不要在您不信任的计算机上使用KeePassPHP——或者任何其他密码管理器!

最后,kphpdb文件比真正的kdbx文件更快解密的想法实际上会破坏针对暴力破解密码猜测的保护。确实,如果用于加密kdbx文件及其对应的kphpdb文件的密码相同,那么猜测该密码的暴力破解与猜测kphpdb文件一样容易,而kphpdb文件的设计上比kdbx文件更容易破解。如果使用不同的密码,就没有风险,但这样一来,用户就必须记住另一个密码,而这并不是密码管理器的精神。在KeePassPHP中,如果您使用kphpdb文件,您可以选择使用完全不同的密码,或者只使用kdbx文件密码的一半来加密kphpdb文件。在后一种情况下,密码的另一半仍然很难被暴力破解。

请注意,这个问题只与主密码猜测有关;攻击者仍然可以尝试在不猜测文本密码的情况下解密kdbx文件的内容,而且kphpdb文件并没有改变这项任务的复杂性。

API

[待文档化;参见示例]

要求

推荐的环境是PHP 5.4及以上版本,以及常见的OpenSSL扩展。

KeePassPHP实际上应该与PHP 5.3及以上版本兼容,并且当OpenSSL不可用(或PHP版本低于5.4)时,可以使用常见的加密库mcrypt。但是,OpenSSL比mcrypt快得多,也更可靠,因此强烈建议在使用KeePassPHP时加载它。此外,在PHP 7.2及以上版本中,mcrypt不再默认包含在PHP中,因此在这种情况下实际上需要OpenSSL。

请注意,对于像libsodium或NaCl这样的高级加密库,KeePassPHP(根据我理解这些库)无法使用,因为这些库需要一些非常特定的密钥(AES 256、CBC和ECB),以解密特定的kdbx文件格式,而这些密钥不通过这些库公开。

许可证

本作品采用MIT许可证。