argon2i 是否“更适合密码散列和密钥派生”?

信息安全 密码 氩2
2021-08-30 01:30:06

我一直在寻找在维基节点argon2在NPM,我来的时候解决这个理由使用argon2i作为默认模式包:

散列函数的变体。Argon2 有几个不同目标的变体:

argon2d is faster and highly resistant against GPU attacks, which is useful for cryptocurrency
argon2i is slower and resistant against tradeoff attacks, which is preferred for password hashing and key derivation
argon2id is a hybrid combination of the above, being resistant against GPU and tradeoff attacks

这个security.stackexchange 帖子表明侧通道攻击不是服务器上的一个大问题(我假设是这里的应用程序),而 argon2id 或 argon2d 会是更好的选择。

此外,声称 argon2i 更适合密码哈希,因为它的速度较慢似乎值得怀疑,因为可以针对任何模式调整迭代次数

“argon2i 速度较慢且可以抵抗权衡攻击,这是密码散列和密钥派生的首选”,这句话有道理吗?

2个回答

如果您要验证密码,在所有情况下,您的首选都是 Argon2id。

万一您不能使用 Argon2id,那么 Argon2i 和 Argon2d 之间的权衡就很重要。

Argon2i 旨在防止侧信道攻击。也就是说,如果您的服务器上有一个无特权的恶意进程,它可能会使用 Spectre 等 CPU 漏洞来梳理出足够的细节来对密码进行逆向工程。通过稍微随机化其内存布局,恶意进程不太可能能够监听。

这在服务器上非常重要;尤其是在云环境中运行的虚拟服务器。

然而,Argon2d 旨在防止在内存受限的环境(如 GPU、FPGA 和 ASIC)中优化并行处理。这里的权衡是通用 CPU 内核往往可以访问大量内存,并且可以同时映射多个内存组。GPU 有几个可编程通道(不完全是 CPU 内核;允许的分支更少)在任何给定时间访问的内存要少得多。切换内存库的映射需要时间,并且使用 GPU 不太理想。由 Argon2d 散列的密码对离线暴力攻击的抵抗力要强得多,因为它的设计是为了让攻击者没有捷径可以比通用 CPU 运行得更快。

如果您知道您的服务器具有物理安全性(只有您可以触摸它),并且您已经审核了该服务器上的每个软件(由于即使是最简单的系统上的大量软件,现代操作系统也不可能) ),那么您可以忽略 Argon2i。

如果您知道您的用户数据库永远不会被泄露,或者您正在使用加密货币而没有人知道哪些输入会生成所需的输出,您可以忽略 Argon2d。如果你是一个加密货币设计师,仍然认为权益证明意味着工作量证明,那么你需要 Argon2i 的内存硬度,以抑制 GPU/FPGA/ASIC 军备竞赛,这些竞赛只会将资金投入到那些已经富有的人的口袋。(还有你们电力公司的口袋……)

如果您像 99.999% 的网站所有者一样,请使用 Argon2id。

这一切都取决于你真正想要什么。

Argon2d 是使用数据相关内存访问(以阻止权衡攻击)的更快变体,使其适用于侧通道攻击不是威胁的应用程序,例如后端服务器或加密货币。它对内存进行了一次传递。

Argon2i 速度较慢,并且使用与数据无关的内存访问,使其适用于密码散列和基于密码的密钥派生用途它对内存进行了 3 次传递。

由于数据依赖的内存访问,A2D 对缓存定时攻击的安全性较低,而 A2I 则不然。

默认情况下,Argon2d 对内存进行单次传递,因此不会覆盖它,使其容易受到 GCA(垃圾收集器攻击)的攻击。相比之下,Argon2i 对内存进行了 3 次遍历,因此将其覆盖了两次,从而阻止了任何类型的 GCA,因为即使攻击者完全访问所有计算后内存也需要他们对内存进行两次遍历以测试候选密码。

您可以在此处阅读以上内容和更多详细信息