AES Crypt 实现对密码进行 8192 次散列以生成密钥。这是必要的吗?

信息安全 密码学 加密 密码 哈希
2021-08-13 22:36:13

我正在考虑使用AES Crypt参考实现加密一些小文件(每个数百 kb) 。查看源代码,似乎加密密钥是从 IV 和密码中派生的,方法是将两者连接到一个缓冲区中,然后重复散列。所以 IV 充当哈希的“盐”。反复,我的意思是8192次。

我知道这样做的好处是增加了生成密钥所需的时间,从而使执行暴力攻击以发现密码的成本更高。我也明白,缺点是为真实用户做合法的加密和解密任务需要更长的时间。此外,随着时间的推移,用户和攻击者都购买了更快的机器,好处和缺点将趋于零。

所以我的问题是,鉴于当前的计算机能力,并假设一个没有专用集群的积极攻击者,8192 次迭代是否不足、过度杀伤或“恰到好处”?另外,在我对这个密钥生成的分析中遗漏了任何东西:选择如此多的迭代是否有其他原因使其成为一个不错的选择?

4个回答

RSA 的基于密码的密码学标准建议“至少 1000 次”迭代,所以这个因素似乎在球场上。

使用 8192 次迭代,您实际上将完成暴力攻击所需的时间增加了相当于在密码或 2 个字母数字字符中添加 13 位熵(仅针对暴力攻击)的因子。这是一种很好的思考方式,因为它与增加的计算能力无关。

问题是:考虑到您或您的用户将使用的密码的安全性,暴力破解是否可行?如果添加13位,暴力破解可行吗?

如果您的用户正在使用强密码,那么两者的答案可能都是否定的。如果您的用户正在使用字典单词,那么 13 位可能不足以将其推入安全领域。随着计算机变得越来越强大,你对这些问题的回答会随着时间而改变。

如果密码是字典词,可以快速高效地生成彩虹表。使用加盐密码,生成有用的彩虹表的大小/时间要求会上升。hash(salt+pass) 的多次迭代是一种大大降低彩虹表有用性的简单方法。我认为 Apache 的盐渍 MD5 方案做了 1000 次。这个数字是完全任意的,它只是显着提高了你必须投入的硬件数量来解决散列机制的问题。使用更好的散列机制(这意味着超越 SHA-1,请注意这甚至不在NSA 的套件 B中不再)是一种方式。还有一些算法可以让你选择你想要多长时间来散列一些东西,这将直接解决摩尔定律导致的“加密货币击败速度蠕变”。

迭代次数应根据您的可用功率进行调整,以便处理时间仍然适合有限用户耐心的硬约束;您仍然希望使数字尽可能高。

使用数学:如果在您的系统上处理密码需要时间T(例如 1 秒),但攻击者准备花费T'来破解密码(例如 3 周)并且可以访问机器,这些机器总共是P次像你一样强大,那么攻击者比你有一个因素T'*P/T的优势。对此的防御是密码熵:如果密码具有熵e位,则攻击者(平均而言)当且仅当T'*P/T < 2 e-1时被击败。假设T = 1 秒,T' = 3 周,P = 100(攻击者有五台 PC 和一些 GPU,预算低于 3000 美元),那么密码必须具有至少 27.4 位的熵。您可能希望有一点安全余量并选择 30 位。作为知情人士,可以选择一个比这更强的密码(在这个问题中有一些关于该主题的讨论);但期望大多数用户也这样做似乎相当乐观。

在上面的等式中,迭代次数用于改变T虽然适当的数字最终取决于您的可用能力和平均用户耐心,但 8192 次迭代可能太少了;根据您对密码转换过程的描述(重复散列 - 这看起来像PBKDF2的简化版本),典型 PC 上的迭代次数应该以百万计

说到这,自定义密码处理技术应该是一个强烈的红色警告:这不好。最好依赖经过验证的标准化算法,例如 PBKDF2 或bcrypt(后者应该是首选,因为它降低了使用 GPU 的攻击者的“处理功率因数” P - 有关详细信息,请参阅此答案)。

如果您选择加密包,我会推荐 GPG 或 PGP over AES Crypt。GPG 和 PGP 得到了密码学社区的大量仔细审查。据我所知,AES Crypt 没有。因此,我会比 AES Crypt 更信任 GPG 或 PGP。

至于迭代密码哈希的次数,这取决于您在加密/解密期间愿意等待多长时间以及哈希函数的速度。首先,决定你愿意等待多长时间:比如 100 毫秒。然后,选择将导致迭代散列过程在您使用的计算机上花费 100 毫秒的迭代次数。完毕。

正如@PulpSpy 准确解释的那样,如果您将散列迭代 N 次,那么这会将秘密的有效熵增加大约 lg(N) 位,其中 lg 表示以 2 为底的对数。例如,8192 = 2^13 次迭代对应于多 13 位有效熵。将其转换为有效的密码长度并不容易。(与@PulpSpy 所写的相反,13 位熵不会直接转换为 2 个字符,因为并非每个密码的每个字符都具有相同的熵。正如@nealmcb 正确解释的那样,密码的每个字符的熵会有所不同,但是可能通常在每个字符 1-2 位的范围内,因此这可能对应于大约 8 个字符附近某处的密码长度增加。)

最后,我会警告您,从密码短语中选择您的加密密钥通常被认为是有风险的做法。人工选择的密码短语通常不能提供足够的熵来防止对加密的暴力攻击。因此,我不建议使用人工选择的密码来实现高安全性措施(或者,如果您必须使用人工选择的密码,请使用软件来帮助您选择高熵密码)。最好的加密软件倾向于尽可能地为其加密密钥使用真正的随机性,而不是人工选择的密码短语。