0

如何使用 PHP 实现一个算法,用于存储和比较 2048 位密码的哈希值以及随机盐的密码?

编辑1:

我想我的问题不够清楚。我的意思是我不会制作我的加密算法。但是如何存储密码和盐。作为每个密码的随机盐。好吧,将盐与密码一起存储在数据库中是不明智的。

编辑2:

那将是一个好方法吗?

1)用户输入他们的密码,
2)系统生成密码的哈希值,
3)系统为此盐生成密码(我使用时间()?)

作为随机盐,如何以及在哪里将盐存储到密码中?拜托,我不想将盐与密码一起存储,因为我认为这不太确定。

因此,在用户登录时存储密码和相同的盐之后,我得到与盐一起存储的密码哈希,并将其与保存的盐提供的密码的哈希进行比较。

在哪里保存盐?这将是一个很好的方法吗?

4

1 回答 1

5

“嗯,将盐与密码一起存储在数据库中是不明智的。”

“因为如果我的数据库遭到破坏并且有人可以访问这些数据,那么每个密码都会包含每个密码的盐。这是不正确的。好吧,我认为使用盐并将其提供给我是没有意义的暴力破解密码。因为它是正确的?

这些核心假设是错误的。盐的重点是为每个密码添加一个唯一元素,这样两个相同的密码就不会散列到相同的散列值。盐不是秘密。我再说一遍:盐不是秘密。秘密是密码,盐只是增加了唯一性。攻击者必须通过尝试所有可能的字符组合并将结果与​​哈希值进行比较来暴力破解密码。如果他也知道盐,他仍然必须这样做。

如果攻击者成功地暴力破解密码“foobar”而不加盐,他就暴力破解了每个密码“foobar”。如果你添加一个唯一的盐并且攻击者成功地暴力破解密码“foobar”+盐,他只暴力破解了那个密码。他将不得不分别攻击每个其他密码“foobar”,因为它们都散列到不同的值,这要归功于唯一的盐。

就是盐的意义所在。是的,如果你也能将盐保密,那就更好了,因为那样的话,攻击者将不得不对一个值进行多次暴力破解。但这是不可行的,因为您还需要访问盐来确认密码。如果您需要访问散列和盐,那么有权访问散列的攻击者也可能对盐具有相同的访问权限。如果攻击者可以访问盐,它也不会降低安全性。

于 2012-11-28T11:46:00.707 回答