重新哈希已经哈希过的密码

5

基础知识
哈希、盐值、PBKDF[1-2]

问题
我正在使用像PBKDF2这样的缩放哈希/盐算法在我的数据库中存储密码。我想:“嘿,如果我将我的密码哈希20000次,那么应该足以防止暴力攻击,对吗?” 这是正确的。直到明年更好的计算机出现。

可能的解决方案

暂且不提加密密钥长度和盐值长度的问题(它们也可以并入此解决方案),我想,如果每隔N天,我重新哈希数据库中的所有密码。因此,它们被哈希了20,000次,然后一周后,我再将它们哈希500次,总共变成20,500次。在数据库中存储已哈希的次数。这个想法是随着技术进步而增加哈希计数。

现有类似实现
BCrypt引入了一个工作因子来增加哈希密码所需的时间:
PBKDF2使用多个迭代来完成相同的操作。Mac OS-X、Windows和Linux用于文件级加密。无线网络也使用它的实现。

有人看到问题了吗?这已经尝试过了吗?是否存在一种算法,可以接受预先哈希的密码并重新哈希它“N”次?

编辑
问题不在于多重哈希是否安全(经过了尝试和测试)。问题在于重新哈希以提高安全性而不必让用户重新设置密码。

解决方案:与JVestry的讨论结果

因此,每隔“N”天重新哈希所有密码是浪费时间的,因为黑客可以通过使用旧数据库副本来破解它。但是,如果将随着时间增加哈希计数的概念结合到密码更新策略中,则该概念是可行的。

实施方法
所有密码在30天后过期。当它们被更新时,它们的哈希计数器会增加。因此,昨天重置的密码比20天前设置的密码更难破解。哈希计数器可以存储或使用最后修改日期的算法派生。

谢谢!

TTD


那么,当有人登录您的站点/应用程序时,需要将其密码散列成荒谬的次数,需要1分钟时间吗? - Jesus Ramos
2
“这应该足以防止暴力攻击…” 这种态度在安全方面是危险的。如果你不能证明你的方法是安全的,最好使用已经被专家彻底审查过的知名方法。 - Jim Lewis
你正在做的工作如何与摩尔定律保持一致? - Joe
随着硬件能力的提高,解密密码所需的时间也会增加(因为哈希数量随时间增加)。因此,您可以不断将密码保持在约1秒钟重新哈希(假定使用标准硬件)。 - David Colwell
@Jim Lewis,我在正文中添加了一些文本,以确保我更清楚地表达我的问题。 - David Colwell
显示剩余2条评论
2个回答

3
Can anyone see a problem with this?

是的。假设您每周与盐重新散列(我相信这是您的意思),仍然存在一个问题。如果有人在第x周访问了散列密码,那么在第x + n周进行任何进一步的散列都不会提供任何额外的安全保障。
黑客只需要在第x周上工作这么多次迭代。一旦找到密钥,他/她就可以像您每周一样更改它。这是非常容易的,完全不会被注意到。
如果您要重新散列,请使用新盐和更多次迭代从头开始。您的快捷方式不会带来额外的安全性。

+1 对于发现时间延迟问题。但这意味着黑客仍在使用旧数据库,所以您的密码超时策略在这里起作用。我更关注未来一年,那时计算机将显著进步。一个月或两个月的变化不是问题,因为计算机并没有那么快地改变 :) - David Colwell
另外,如果您不知道原始密码,如何使用更多的迭代从头开始重新哈希? - David Colwell
暴力破解攻击将会揭露密码。一旦被破解,就会一直被破解直到更换密码。碰撞攻击也是可能的。通过重新哈希散列值,你提供了越来越多的信息。但这仍然不是一个好主意。如果密码超时,那么你仍然需要进行x + n次哈希迭代。因此没有从快捷方式中获得任何好处,只有虚假的好处。 - Jérôme Verstrynge
我有点假设黑客已经获取了你的数据库,并且已经知道了你的哈希算法、盐等信息。这个假设很愚蠢吗? - David Colwell
如果您预计明年需要进行100次迭代以确保安全,请确保所有未在明年进行100次哈希的密码将在明年自动停用。因此,您不必重复无谓的哈希操作。 - Jérôme Verstrynge
如果你的数据库在第x周被攻击,你需要重新生成一个新的密码和新的盐值。仅仅选择一个新的盐值并不能保护你的用户,如果密码没有改变的话。 - Gudradain

2

这样做会使暴力破解变得更加困难,但也会使您的登录过程变慢。

最好使用更多的盐。


1
增加盐的长度可以在此基础上进行,但是考虑到黑客知道你的盐值,暴力攻击很快就能得到一个散列密码。我总是假设黑客知道盐值。 - David Colwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接