关于选择哈希函数有很多问题,包括如何安全地哈希密码?还是有比bcrypt和scrypt更现代的密码散列方法?答案非常详细,但其中必须有相当多的答案。
共识似乎是:

bcrypt是一种不错的选择
scrypt应该是一个更好的选择,但是,在当时,它还是一个新事物,因此应该等待它是否经受住时间的考验

scrypt现在是一个不错的选择吗?
Argon2已经是一个不错的选择吗?功能应该偏爱吗?对于那些具有参数的函数,它们应该是什么?到2010-2013年,最新的相关更新可追溯到2016年。此后,事情显然发生了变化,我正在寻找的是对这些出色答案的更新。随意回答该问题,如果您认为更有意义,请关闭此问题,但请不要在此处或此处没有最新答案的情况下关闭此问题。

评论

如何安全地散列密码的可能重复项?

简而言之,现在推荐使用Argon2,它具有您可以忍受的最高参数。 Scrypt也是安全的,但灵活性较差,bcrypt总比没有好,但在如今内存特别困难的地方。

@forest我真正要照顾的是“例外”。真的已经推荐了吗?别人认为它经受了时间的考验吗?还很新。同样,在大多数答案中,scrypt本身仍然被认为是“相当新的”。我想情况不再如此。当前的“可行”参数又如何呢?

是的,它仍然经受了时间的考验。更不用说,它是标准化的。至于“可行参数”,那确实取决于您。无论事情如何发展,答案总是会“尽可能地高”。

不过,@ forest bcrypt只是“胜于无物”是一种轻描淡写的说法。这三种算法都非常安全,并且除非攻击者的动机非常强烈并且拥有大量资源,否则它们都将发挥出色的作用。您甚至可以说Argon2(甚至更是如此scrypt)仍需要进行更多分析,然后才能放心地认为它们要优于bcrypt。

#1 楼

我不建议将bcrypt用于输入值为人为生成的令牌(例如密码)且威胁模型中存在离线破解的新设计。当您考虑当今这些商品的硬件功能多么强大时,缺乏存储硬性是一个严重的问题。尽管缺少主要的基于bcrypt的加密货币并没有吸引该算法的FPGA或ASIC挖掘实现,但仍然有一些使用混合ARM / FPGA SoC攻击bcrypt的兴趣,例如,2014年的这篇论文。内存硬度对于现代设计来说是一个重要问题。

scrypt在其设计中具有内存硬度,但存在一些不足。首先,有很多基于scrypt的加密货币,这吸引了相当大的商品FPGA和ASIC挖掘解决方案市场,这些解决方案可用于破解。此外,scrypt的内存硬度和迭代次数都与单个标量成本因素相关。这使得难以根据您自己的威胁模型定制scrypt。我建议使用scrypt,它是您所使用的语言或框架中最简单的密码存储选项,例如,如果它已经是用于保护用户密码的内置选项。

最终,我始终建议Argon2作为首选的选择,有以下几个原因:


它已经存在了一段时间-它在2015年获得了PHC奖。有很多研究Argon2安全证明的论文,还有更多研究在专用硬件上加速算法的潜在方法。到目前为止,它已经很好地经受了严格的审查。 Core),Perl和Swift。
Argon2是围绕AES密码构建的,大多数现代的x86_64和ARMv8处理器都实现了AES指令集扩展。这有助于弥合预期系统和专用破解系统之间的性能差距。 (编辑,2019年2月:似乎新版本的Argon2可能与硬件扩展中的AES实现不兼容。有关此问题的评论,请参阅注释。)存储空间只有三分之一,这使得在FPGA上廉价地加速变得更加困难。这是因为基于FPGA的破解解决方案主要受内存带宽的限制,并且采用Argon2的设计,攻击者必须吞下很大的计算时间才能减少内存带宽需求,从而使折衷效率降低。您可以在Argon2论文的第5.1节中阅读有关此内容的更多信息,并在论文“存储器硬函数的权衡分析”的表6(第5节)中提供有关scrypt的信息,以进行比较。可以并行配置CPU硬度参数以及并行度因子。这使您可以更好地定制与用例相关的安全性,例如具有中等CPU能力和大量RAM的服务器。

如您所述,选择的参数很重要。 scrypt不会给您太多选择,因此在这种情况下,我建议您根据时间(例如1500ms处理时间)选择一个成本因素。

对于Argon2,您可以选择的不仅仅是参数。实际上,存在三种不同的Argon2实现,分别称为Argon2d,Argon2i和Argon2id。第一个是Argon2d,在计算上最昂贵,并且能够抵抗内存带宽有限的GPU,FPGA和ASIC的加速。但是,由于Argon2d的内存访问取决于密码,因此泄露有关内存访问信息的旁道攻击可能会泄露密码。如其后缀所示,Argon2i会独立于密码来选择内存地址。这降低了其对GPU破裂的抵抗力,但消除了边通道攻击。 Argon2id是一种混合方法,其中第一遍使用Argon2i(独立)方法,随后遍历使用Argon2d(依赖)方法。

尽可能使用Argon2id实现。但是,这并不总是可用。对于您在服务器上保护密码并且威胁模型认为不太可能发生内存访问侧通道攻击的情况(根据我的经验,这是大多数时间),可以使用Argon2d。如果将内存访问侧信道攻击视为潜在风险,例如在多租户系统中,如果不受信任或不受信任的用户在执行Argon2哈希的同一系统上运行代码,那么Argon2i可能是更好的选择。简而言之:如果可以,请使用Argon2id,在几乎所有其他情况下都使用Argon2d,如果您确实确实需要内存侧通道攻击抵抗力,请考虑使用Argon2i。

对于参数,唯一的硬性规则适用于Argon2i,由于Argon2i具有特殊的规则与其他选择相比相对较弱。具体来说,由于对Argon2i进行了实际的权衡攻击,因此迭代次数必须为10次或更多。 Argon2id和Argon2d可接受的默认值:


512MB内存
8次迭代
并行度为8

速度取决于您的处理器,但是我在系统上达到了约2000ms。

对于Argon2i,您必须提高迭代次数最少为10,这可能会由于性能原因而要求您减少内存系数。这是尝试避免Argon2i的另一个原因,除非您绝对需要Argon2i对内存访问侧通道有抵抗力。

评论


@MikeSchem尽管他们不会自己依靠自己,但是拥有足够资源的对手可以简单地重用现有的硅IP来构建能够做到的事情。与全新设计相比,这可大幅降低成本。

–多项式
18年11月13日在9:14

@MalcolmMacLeod我的理解是,由于某些实现细节,某些AES-NI指令与Argon2不兼容,而AES-NI指令集的其他部分仍然有用,但是我同意文档尚不清楚。我不得不问作者或实际实施过它的人。

–多项式
19-2-23在17:26



通过进一步的阅读,我了解到比赛期间的早期版本的argon2可以使用AES-NI,但在修改后不再如此。可能我弄错了,但这对我来说就是这样。也许,如果我们不能100%澄清问题,至少要更新答案以声明不是100%清晰,以避免任何人在没有进一步研究的情况下得出错误的想法。

–马尔科姆·麦克劳德(Malcolm MacLeod)
19-2-27在21:54



Argon2多大了? (专家试图破解它有多长时间了?)

– jpmc26
19年2月28日在10:56

@ jpmc26原始版本为2015。直到2017年3月进行了更新。但是,值得注意的是,Argon2是基于原语和设计结构构建的,而这些原形和设计结构已经存在了很长的时间,因此一些密码分析工作可以从以前的工作中转移而来。其他算法。上面链接的Argon2论文的安全性分析部分也写得很好。这些分析都没有依靠不寻常的证据或可疑的假设。

–多项式
19年3月3日在17:18