我一直在寻找保护用户密码的方法。我目前正在使用哈希算法和随机盐的一些组合。
这个问题的主要问题是我的用户设置了一个非常弱的密码。无论我的混合哈希算法有多难,以及我的盐多长时间,我认为它可以在不到一年的时间内破解。
我一直在想一种新的方式。我创建了一个脚本,每次用户注销时都会通过在旧的哈希密码上添加随机盐来重新加密密码,然后再次加密。因此,每次用户返回时,加密的密码都不同。得到它?
但这个想法的主要问题是,每次用户注销时我都必须存储新的盐。想象一下,如果用户每天都登录并注销,我的代码会是什么样子?
有什么想法吗?
哦,我有个主意。如何每年重新生成新的加密密码?
答案 0 :(得分:3)
重新加密对您的问题没有帮助。
你唯一能做的就是创建一个多部分哈希,并希望攻击者不会得到所有这些哈希。我通常使用两份盐:
一部分是随密码存储在数据库中的随机每用户值。
另一部分是每个应用盐。您可以将其存储在应用程序配置中或OS提供的特殊密码存储区中。
这种分裂的好处是,如果攻击者只是获得对数据库的访问权限,那就不够了,但是他需要访问存储应用程序盐的任何地方。因此,例如,简单的SQL注入窃取您的数据库是不够的。如果攻击者可以执行代码,它可能根本无济于事。
你应该使用一些方法来减慢散列。典型的哈希函数速度很快,因此蛮力也很快。但是如果你对哈希函数进行一百万次迭代,它仍然不会减慢有效登录的速度,但会大大减慢蛮力。
您可以使用Password Based Key Derivation Function来实现这一目标,例如PBKDF2。
答案 1 :(得分:1)
你可以使用“按键拉伸”:在盐腌之后迭代哈希,比如一百万次。 然后存储哈希值,盐和迭代计数。 然后,攻击者可以检查每秒密码少于一次哈希值的百万次密码。但是一个非常短的密码仍会下降:注意你自己,要验证合法密码,需要做同样的操作。假设您接受1秒的时间自行检查,那么攻击者也可以在类似的机器上以每秒密码1秒的速度检查密码(如果他使用更多或更快的机器,则更多!)。每个密码1秒仍然足以检查弱密码和短密码,标准词典等。确实没有防御它,只会使它变得更难。
答案 2 :(得分:0)
您的主要假设存在两个问题。第一个是关于储存盐的问题。您已经为盐渍密码解决方案做了。随着你的新方法,盐会随着时间而改变,就是这样。所以你可以使用这种方法,唯一的额外成本是每次登录时重新计算哈希值(当你实际拥有密码字符串时)。
第二个问题是更重要的问题:重新散列不会改变任何东西。一旦攻击者获得一个盐渍哈希值,就足以安装字典攻击。您在数据库中更改salt和hash的事实不会让它变得更加困难。因此,在创建第一个哈希后,无需重新计算哈希值。