如何使用PHP为每个密码实现一个用于存储和比较2048位哈希值的密码的算法?
编辑1:
我想我的问题并不清楚。我的意思是我不会制作加密算法。但是如何存储密码和盐。作为每个密码的随机盐。那么,将盐和密码一起存储在数据库中是不明智的。
编辑2:
那会是一个好方法吗?
1)用户输入密码,
2)系统生成密码的散列,
3)系统为这个盐生成密码(我用time()?)
作为随机盐,如何以及在何处将盐存储到密码中?请,我不想将盐与密码一起存储,因为我认为这不太确定。
因此,在用户登录后存储的密码和相同的盐之后,我将获得与salt一起存储的密码哈希值,并将其与保存的盐提供的密码的哈希值进行比较。
在哪里保存盐? 这样做是一个很好的方法吗?
答案 0 :(得分:5)
“嗯,将盐和密码一起存储在数据库中是不明智的。”
“因为如果我的数据库遭到入侵并且有人可以访问这些数据,那么每个密码都会有每个密码的盐。这是不正确的。我想我只是没有意义使用盐和把密码和密码一起给它。因为它是正确的吗?“
这些核心假设是错误的。 salt的要点是为每个密码添加一个唯一元素,因此两个相同的密码不会散列到相同的散列值。盐并不是秘密。我再说一遍:盐并不是秘密。秘密是密码,盐只是增加了唯一性。攻击者必须通过尝试每个可能的字符组合并将结果与哈希值进行比较来强制设置密码。如果他也知道盐,他仍然必须这样做。
如果攻击者在没有盐的情况下成功地强制密码“foobar”,那么他就会强行每个密码“foobar”。如果您添加一个独特的盐并且攻击者成功地强制使用密码“foobar”+ salt,那么他只会强行使用该密码。他将不得不分别攻击所有其他密码“foobar”,因为它们都是哈希值不同,这要归功于独特的盐。
是盐的重点。是的,如果你能保持盐的秘密,那将会更好,因为那时攻击者必须基本上强制一个值多倍。但这是不可行的,因为你需要访问盐来确认密码。如果您需要访问哈希和salt,那么有权访问哈希的攻击者可能也具有相同的访问权限。如果攻击者可以访问盐,它也不会从安全性中删除 。