Argon2 是密码哈希竞赛的获胜者,目前被 OWASP 推荐用于安全存储密码。
Argon2 的一个关键步骤是确定函数使用的参数。当前的 IETF 草案标题为“ The memory-hard Argon2 password hash and proof-of-work function ”有一个名为“Parameter Choice”的章节,它提供了寻找正确参数的分步指南。
-
选择类型y。如果您不知道它们之间的区别或将旁道攻击视为可行的威胁,请选择 Argon2id。
这一步看起来很简单。建议默认使用 Argon2id,除非您知道其他模式更适合您的用例。
-
计算每次调用 Argon2 可以启动的最大线程数h 。
这一步是第一个令人困惑的步骤。一个人如何“弄清楚”应该使用多少线程?如果只使用一个线程,是否不安全?
-
计算出每个调用可以承受的最大内存量m。
这一步似乎更直接了。但是,如果服务器有 128 GB 的 RAM,并且预计在高峰时间有 ~1024 个并发登录,那么 ~ 128 MB 是最大值。然而,这并没有回答,如果有 10 倍的用户怎么办?如果 1 MB 是最大值怎么办?如果最大 16 KB 会怎样?哪一点是“太少”的记忆?
-
计算出每个呼叫可以承受的最大时间量x(以秒为单位)。
这看起来很简单,更高的数字意味着以登录速度为代价的更高的抗破解性。
-
选择盐的长度。128 位对所有应用程序来说都足够了,但在空间限制的情况下可以减少到 64 位。
这非常有用,因为它提供了一个被认为是合理的默认值。
-
选择标签长度。128 位足以满足大多数应用程序,包括密钥派生。如果需要更长的键,请选择更长的标签。
就像第 5 步一样,这很有帮助,因为它提供了一个合理的默认值。
-
如果侧信道攻击是一个可行的威胁,或者如果您不确定,请在库调用中启用内存擦除选项。
有用的信息,因为它解释了它试图减轻的威胁。
-
运行类型y、内存m和h通道和线程的方案,使用不同的通道数t。找出最大值t,使运行时间不超过x。如果即使对于t = 1它也超过x,则相应地减少m。
这一步是迄今为止最令人困惑的。这个想法显然是对系统进行基准测试,为m、h和t找到“好”值,但它没有为这些参数提供任何优先级。低内存,但高并行性和多次迭代是否好?高内存和并行性如何,但迭代很少?
总结一下:
- 被认为是“安全”的并行度和内存使用的最小值是多少?
- 内存使用、并行性和迭代有什么优先级?
- 如果一个参数太低,而另外两个相对较高,仍然得到大约 1 秒的执行速度会怎样?