使用加密哈希存储例如数据库中的密码被认为是一种好习惯(相对于将其存储为纯文本而言),但是,假设数据库受到破坏,则容易遭受对所述密码哈希的攻击。<​​br />
密码哈希函数的哪些属性使其得以使用

哪些功能足够安全,同时仍然可以广泛使用,没有专利问题并且计算量也不大?

评论

另请参阅除了速度之外,还有什么区别密码哈希和密码哈希?

#1 楼

对于密码哈希,不应使用常规的密码哈希,而应使用专门用于保护密码的哈希,例如bcrypt。

请参阅如何安全地存储密码以获取详细信息(本文提倡使用bcrypt )。

重要的一点是,密码破解者不必暴力破解哈希输出空间(SHA-1为$ 2 ^ {160} $),而只有密码空间,这是很多较小(取决于您的密码规则-词典通常会有所帮助)。因此,我们不需要快速的散列函数,而需要较慢的散列函数。因此,实际上不可能满足您不太昂贵的要求。 Bcrypt和朋友*是为此目的而设计的。

* Bcrypt和朋友:所有慢速哈希函数。有PBKDF-2(基本上只是用一些可配置的大量回合用盐迭代一个快速的哈希,因此蛮力可以很容易地并行化-但是在NIST标准中提到过,这对于某些用途可能很重要), bcrypt(另外需要4 KB的内存,这使得标准GPU上的并行化(蛮力)相当慢,但是仍然可以在每个处理单元具有4KB缓存的定制硬件上受到攻击)和scrypt(不仅需要可配置的时间量,但也有可配置的执行空间量(可能需要权衡时间),因此无法轻易(廉价地)并行执行暴力破解。)

当然,您应该始终使用加盐的哈希值(bcrypt自动包含一个盐)。盐与哈希一起存储在数据库中(例如,它不比哈希更秘密),并且将与密码一起哈希以产生哈希。

单独添加盐并不能帮助专门针对您的密码进行蛮力攻击,但可以帮助抵抗彩虹表攻击(即具有预先计算的哈希列表的攻击),该攻击可以在所有时间同时遍及所有地方而不是只有所有带有相同盐的密码(应该只有一个)。

还有“秘密盐”(也称为Pepper)的概念,它不会与密码一起存储,但在可能的攻击者无法访问的其他位置。 (然后,您通常会使用胡椒粉作为非用户特定的信息以及普通的盐。)

这仅适用于某些攻击情形,其中攻击者确实只有(读取)对数据库(或可能在数据库上的安全性较低的备份副本)的访问,但不访问此Pepper数据(即,我们有一个攻击者尚无法在服务器上执行任意代码)。

另一种可能性是使用带有嵌入式密钥的服务器上连接的某种加密硬件(令牌),该硬件对盐,密钥和密码进行某种哈希运算以产生哈希。确保对它进行速率限制以防它被盗,并确保它没有检索密钥的接口,否则攻击者(如果她成功获得了服务器上的执行访问权限)也可以使用此方法。 br />

评论


$ \ begingroup $
自从我研究并行化以来已经有一段时间了,所以也许这很明显:PBKDF-2如何容易地并行化?如果哈希算法在密码学上是安全的,那么似乎不可能(排除某些缺陷)并行处理串行迭代。这样做将需要对哈希算法的输出有所了解。您无法并行化f(a)= b,f(b)= c,f(c)= d,因为您必须先运行f(a)(同上c)才能启动f(b)。
$ \ endgroup $
–帕特里克M
13年3月19日在20:02



$ \ begingroup $
@PatrickM一次运行的PBKDF-2本身是不可并行的,但是如果您强行强制使用密码,则我们可以使用相同的密码多次运行同一哈希函数。对于上述三种方案,可以将其并行化到不同的程度。我将不得不看看如何在我的答案中表达这一点。
$ \ endgroup $
–PaŭloEbermann
13年3月19日在20:11

$ \ begingroup $
嗯,这很清楚。但是我想不出任何无法并行化的暴力攻击...僵尸网络攻击服务器,或者如果您拥有哈希列表,则在其中添加更多硬件并启动更多线程/ vm。
$ \ endgroup $
–帕特里克M
13年3月19日在21:39

$ \ begingroup $
这很便宜。带有快速哈希功能的PBKDF-2(本身不占用太多内存)可以在GPU上实现,然后(每次调用)成本要比“普通计算机”的原始执行成本低很多。 Bcrypt需要4K的快速可访问内存,而典型的GPU却没有这种内存–因此,速度的提高受到GPU内存总线容量的限制。不过,自定义硬件可以在这里提供帮助。 Scrypt需要大量内存(使用正确的参数时),并且内存虽然通常可供PC上的“普通用户”使用,但对于蛮力攻击者而言并不便宜。
$ \ endgroup $
–PaŭloEbermann
13年3月19日在21:52



#2 楼

像这样的更实际的问题实际上会引发风险管理问题,它更适合更广泛的受众,请访问https://security.stackexchange.com/那里的相关问题,例如如何安全地对密码进行哈希加密。

在很多情况下建议使用Bcrypt。但是,如果您需要使用经批准可用于美国政府工作的算法,则可能更喜欢PBKDF2。或者,如果您的主要关注点是长期抵抗硬件攻击,那么考虑到scrypt具有“内存硬性”和抵抗硬件攻击的能力,scrypt会更适合。

因此,没有一个真正的答案,最好去风险管理专家的聚会。

更新:“密码哈希竞赛”为密码哈希算法的良好属性建立了现代基准。在2015年,它选出了获奖者:Argon2。 Argon2被设计为“难以记忆”,从而使破解者难以实现GPU实现;简单;高度可配置;似乎正在通过时间的考验,尽管正如Thomas所指出的那样,现代密码哈希方法是否比bcrypt和scrypt? br />