具有2048位和salt的哈希算法

时间:2012-11-28 10:57:55

标签: php security hash salt

如何使用PHP为每个密码实现一个用于存储和比较2048位哈希值的密码的算法?

编辑1:

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

编辑2:

那会是一个好方法吗?

1)用户输入密码,
2)系统生成密码的散列,
3)系统为这个盐生成密码(我用time()?)

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

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

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

1 个答案:

答案 0 :(得分:5)

  

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

     

“因为如果我的数据库遭到入侵并且有人可以访问这些数据,那么每个密码都会有每个密码的盐。这是不正确的。我想我只是没有意义使用盐和把密码和密码一起给它。因为它是正确的吗?“

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

如果攻击者在没有盐的情况下成功地强制密码“foobar”,那么他就会强行每个密码“foobar”。如果您添加一个独特的盐并且攻击者成功地强制使用密码“foobar”+ salt,那么他只会强行使用该密码。他将不得不分别攻击所有其他密码“foobar”,因为它们都是哈希值不同,这要归功于独特的盐。

是盐的重点。是的,如果你能保持盐的秘密,那将会更好,因为那时攻击者必须基本上强制一个值多倍。但这是不可行的,因为需要访问盐来确认密码。如果您需要访问哈希和salt,那么有权访问哈希的攻击者可能也具有相同的访问权限。如果攻击者可以访问盐,它也不会从安全性中删除