所以我目前正在开发我的GitHub项目,我想实现Argon2。问题是我对此并不了解很多。互联网研究并没有真正的帮助,因为Argon2才有2年历史,所以真正存在的只是科学论文和GitHub页面。我将从第一个开始:

如果Argon2id是Argon2i和d的混合版本,那么为什么人们甚至使用另外两个,那么使用抗性的东西会不会更安全侧通道攻击和GPU破解?

评论

我猜想Argon2id牺牲了其对Argon2d的权衡抵抗,因此Argon2d在这方面应该更好。 Argon2id可能还存在一些旁通道问题(实际上并没有深入探讨),Argon2i可以缓解这些问题。您是否考虑过阅读规范(GH上的PDF)来回答您的问题? ;)

这是因为Argon2id是后来添加的。最初只有Argon2i和Argon2d。而选择哪一个取决于您是否担心旁通道攻击。后来他们想到了Argon2id。 i和d的混合体。消除一些歧义是很不错的,他们建议使用id作为基准。

#1 楼

我认为,当前的Argon2 RFC草案为该问题提供了一个良好且合理的简要答案。 TL; DR:大多数人确实希望使用Argon2id而不是“ pure”变体。

引言很好地总结了这些问题:


Argon2具有一个主要变体:Argon2id,两个补充变体:Argon2d和Argon2i。 Argon2d使用依赖于数据的内存访问,这使其适用于加密货币和工作量证明应用程序,而不会受到旁通道定时攻击的威胁。 Argon2i使用与数据无关的内存访问,这对于密码哈希和基于密码的密钥派生而言是首选的。 Argon2id在内存上第一次迭代的前半部分充当Argon2i,其余部分则充当Argon2d,因此由于时间记忆的折衷,既提供了边通道攻击保护,又节省了蛮力成本。 Argon2i在内存上进行更多的传递以防止权衡攻击。


基本上,考虑两种攻击:计时攻击。
时间记忆权衡(TMTO)攻击。

Argon2d容易受到计时攻击,但对TMTO的抵抗力最好(第9.2节):


在$ t $ -pass Argon2d上最好的权衡攻击是等级权衡攻击,它将时域积减少1.33倍。


Argon2i不可侵犯对边信道定时攻击的攻击,但对TMTO的攻击较弱:对1遍和2遍Argon2i的最佳攻击是[CBS16]中描述的低存储攻击,它将时域乘积(使用峰值内存值)减少5倍。对3遍的最佳攻击-pass和更多Argon2i是[AB16],其缩减因子是内存大小和通过次数的函数。对于1 GiB内存:3表示3遍,2.5表示4遍,2表示6遍。内存大小每增加一倍,减少因子就会增加约0.5。为了完全防止[AB16]的时空折衷,传递的$ t $数必须超过内存的二进制对数减去26。


Argon2id位于以下两者之间:


1遍Argon2id的最佳权衡攻击是组合的低存储攻击(针对内存的前半部分)和排名攻击(针对后半部分),它们的综合系数约为2.1 。


由于Argon2运行时间随通过次数线性增长,所以六次通过的Argon2i的速度大约是一次通过的Argon2id的六倍。

RFC草案还声明(没有解释)Argon2id可以抵抗定时攻击,并建议将其作为主要变体,并明确告诉您(第4节,“参数选择”),如果您不知道使用哪个,则应选择Argon2id 。您可能应该等到RFC批准完全提交任何内容,但是与此同时,如果您要编写一些早期代码,则可以偏向于Argon2id。

评论


$ \ begingroup $
是的,但是有趣的是PHP7.2可以直接使用argon2i进行密码哈希处理,这有点可悲,因为您更容易受到折衷的影响,并且内部没有argon2id。
$ \ endgroup $
– My1
17年9月21日在10:37

$ \ begingroup $
Argon2i并不是最糟糕的结果,但是在7.3中使用Argon2id将是一个不错的选择。立即打开RFC。
$ \ endgroup $
–斯科特·阿西塞夫斯基(Scott Arciszewski)
17-10-2在14:48

$ \ begingroup $
通过libsodium扩展,PHP已支持Argon2id。
$ \ endgroup $
–弗兰克·丹尼斯(Frank Denis)
17年12月14日在15:43

$ \ begingroup $
@FrankDenis是,但是1)主机需要钠(并非每个主机都具有钠),并且主机需要最新的钠,因为据我所知,较旧的钠版本在a2i上运行(这可能是错误的,因为我对钠不是很熟悉)
$ \ endgroup $
– My1
18年1月16日在12:07

$ \ begingroup $
随着PHP 7.3的发布,PHP现在正式支持Argon2id。
$ \ endgroup $
– Sumit
19-09-8在19:58