KeePass 的密钥派生方法是否安全?

信息安全 密码管理 密码破解 守望先锋 按键拉伸 kdf
2021-08-23 12:12:03

我熟悉如何使用密钥派生函数通过需要大量计算和/或内存资源来计算最终密钥来减缓对密码的暴力攻击。

我知道的常见 KDF 是 bcrypt、PBKDF2 和 scrypt,但 KeePass 似乎使用了一种我不熟悉的完全不同的算法。根据KeePass 的帮助中心

为了生成用于分组密码的最终 256 位密钥,KeePass 首先使用 SHA-256 对用户密码进行哈希处理,然后使用高级加密标准 (AES) 算法对结果进行 N 次加密(从现在开始称为密钥转换轮次) , 然后使用 SHA-256 再次对其进行哈希处理。对于 AES,使用随机的 256 位密钥,该密钥存储在数据库文件中。

[...]

默认情况下,KeePass 将 N 设置为 6000 轮加密(意味着完全加密;N 与 AES 的内部加密轮无关)。选择这个数字是为了提供与便携式设备版本的兼容性(PocketPC 处理器速度较慢,因此密钥计算需要更长的时间)。

将 AES 用作 KDF 是否安全?这种方法有什么严重的缺陷吗?6000 次迭代是否足以显着减慢坚定的攻击者?

关于“PocketPC 处理器”的那句话有点令人担忧,因为它向我暗示,这个关于使用什么 KDF 的决定是在很久以前做出的,在具有更强大处理器的手机出现之前(并且,通过扩展,在桌面处理器几乎没有那么强大)。

2个回答

根据Malik Mesellem 2014 年的一条推文,他创建了一个名为 KeeCracker 的 KeePass 主密钥破解软件,他在 Intel i7 CPU 上使用他的工具每秒获得超过 1,000 次密码猜测。

在回答2011 年有关 KeePass 密钥存储的类似问题时,Tom Leek 讨论了使用四核 CPU 每秒猜测 32,000 次密码的可能性。这可能是一个最佳情况估计,由于管理这些 AES 操作的破解软件效率低下,这一估计进一步下降,就像我们在 KeeCracker 图中看到的那样。

就密码破解而言,这两种估计都非常慢,您经常会在单个 GPU 上看到每秒数亿或数十亿的哈希值,而 MD5 等算法选择不当。KeePass 实现比 bcrypt 或 scrypt 的“典型”现代实现要快一些,但可能不会快到您认为它们属于完全不同的类。

我不知道对他们选择算法或实现的任何批评,我自己也没有资格评估它们,但似乎这不是一个糟糕的选择。如果您想要一个“面向未来的”密码存档,我认为质疑 6000 轮是否足够是公平的,但似乎这不一定是今天使用的不负责任的数字。

因此,KeePass 用户最关心的应该是选择能够承受更简单的破解尝试的主密码(例如,不是密码)。不要使用已知的短语,不要太短,不要根据某人对你的个人了解来预测它,等等。如果你适当地避免这些事情,你的密码短语就不太可能通过字典、混合方式被发现,或暴力破解攻击。

关于你的最后一个问题:你担心与 PocketPC 处理器的兼容性是对的,因为6000 发是一个不安全的设置您应该将此值设置为 5000000 左右。缺点是密码存档的加密/解密需要更长的时间,因此您应该尝试找到导致您满意的延迟的最高值。