如何正确调整 Go 中的 Argon2 参数以减少内存消耗?

m90*_*m90 6 cryptography go password-hash argon2-ffi

Argon2的设计是内存占用。在半官方的 Go 实现中,使用时推荐使用以下参数IDKey:

key := argon2.IDKey([]byte("some password"), salt, 1, 64*1024, 4, 32)
Run Code Online (Sandbox Code Playgroud)

其中1是时间参数,64*1024是内存参数。这意味着在对值进行散列时,库将创建一个 64MB 的缓冲区。在许多散列程序可能同时运行的情况下,这会对主机内存造成很大压力。

在内存消耗过多的情况下,建议减少内存参数并增加时间因素:

RFC 草案建议[2] time=1,memory=64*1024 是一个合理的数字。如果在某些情况下无法使用该内存量 (64 MB),则可以增加时间参数以进行补偿。


因此,假设我想将内存消耗限制为 16MB(推荐的 64MB 的 1/4),我仍然不清楚我应该如何调整time参数:这应该是4 倍,以便内存和时间保持不变?或者在时间和记忆的相关性背后是否有其他一些逻辑在起作用?

小智 1

RFC 草案建议[2] time=1,而内存=64*1024 是一个合理的数字。如果在某些情况下无法使用该内存量 (64 MB),则可以增加时间参数进行补偿。

我认为这里的关键是“补偿”这个词,所以在这个上下文中它试图说:要实现与 类似的哈希复杂性IDKey([]byte("some password"), salt, 1, 64*1024, 4, 32),你可以尝试IDKey([]byte("some password"), salt, 4, 16*1024, 4, 32)。
但是,如果您想降低散列结果的复杂性(并降低性能开销),则可以减小memory uint32忽略time参数的大小。

这是否应该是 4 倍,以便内存和时间的乘积保持不变?

我不这么认为,我相信memory这里的意思是结果散列的长度,但time参数可能意味着“散列结果需要重新散列多少次,直到我得到最终结果”。

所以这两个参数是相互独立的。这些只是控制您想要实现的“由于时间内存权衡而节省的强力成本”