多次应用 AES 是否更安全?

信息安全 加密 AES 字典
2021-08-13 16:32:53

KeePass安全帮助页面讨论防止字典攻击

为了生成用于分组密码的最终 256 位密钥,KeePass 首先使用 SHA-256 对用户密码进行哈希处理,然后使用高级加密标准 (AES) 算法对结果进行 N 次加密(从现在开始称为密钥转换轮次) , 然后使用 SHA-256 再次对其进行哈希处理。对于 AES,使用随机的 256 位密钥,该密钥存储在数据库文件中。由于 AES 转换不可预先计算(密钥是随机的),攻击者也必须执行所有加密,否则他无法尝试查看当前密钥是否正确。

“针对字典攻击的安全性”显然在于 N 轮加密所需的时间。现在的问题:

计算 AES 的 N 次迭代所需的时间真的是单个 AES 加密所需时间的 N 倍,还是有一个已知的、更有效的方案来计算 AES^N(明文)?

3个回答

多次执行 AES 没有用。如果您使用正确的密钥,破坏 AES 将需要无穷大。KeePass 在这里所做的是使从密码导出密钥的速度变慢,因此暴力攻击将花费很长时间,因为对于每个密码,密钥都需要重新计算(这是 PBKDF2、Scrypt 和 Bcrypt 试图解决的问题)。

虽然这可能会减慢字典攻击,但它不会阻止它们。防止字典攻击只能通过使用足够长的随机密码来完成。

在此处输入图像描述

据我所知(我可能是错的,因为我不是密码学家),不应该有比 N 次 AES 迭代更有效地计算 AES^N 的方法。他们使用这种算法的主要原因是因为它真的很难(不可能)使计算更有效率,因此它不太容易受到蛮力的影响。

我希望 Thomas Pornin 能够让您对此有更多的了解。

没有但是,您的问题与您引用的文本无关。实际数据(密码数据库)并未真正加密多次

为了使用 AES-256 加密某些内容,您需要一个 256 位密钥。MyPass!sAwesome为此目的,密码是可悲的。好消息是有一种叫做KDF(密钥派生函数)的东西,它接受密码并将其转换为加密所需的巨大密钥。KDF 越慢,攻击者就越难通过尝试大量密码来计算最终密钥。一种标准且广泛使用的 KDF 是PBKDF2

(请阅读如何安全地散列密码?以便以下类比更有意义)

KDF 通常使用加密哈希函数、盐和迭代计数。KeePass 选择编写自己的 KDF 逻辑,并通过使用 6000 轮 AES 使其变慢。他们所做的只是简单地使用 AES 作为他们的加密哈希函数,随机 256 位密钥作为盐,以及 N 作为迭代计数。

KeePass 文档中“字典攻击预防”的含义实际上是通过使用安全盐来防止彩虹表(使用盐的随机 256 位密钥非常安全)。

如果我正确理解您的问题,您是在询问多个 AES 加密操作是否具有“已​​知优化”。答案是不”。如果有,它必须在 AES 的内部轮次上工作,而由这些多轮次创建的防御将很快被挫败。然而,正如我们知道减少轮数会导致弱点一样,我们也知道增加轮数会使其安全(今天)。相同的逻辑适用于更大范围的多重加密。

换句话说,如果存在这样的优化,那将是底层密码的一个弱点。这意味着我可以通过要求算法再次加密数据来了解更多关于内部状态的信息。

如果 KeePass 将相同的数据输入到每次加密迭代中,这将不太确定,但事实并非如此——输入第 n+1 轮的唯一内容是第 n 轮的输出。