具有2048位和salt的哈希算法

May*_*onn 0 php security hash salt

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

编辑1:

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

编辑2:

那会是一个好方法吗?

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

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

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

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

dec*_*eze 5

"好吧,将盐和密码一起存储在数据库中是不明智的."

"因为如果我的数据库遭到入侵并且有人可以访问这些数据,那么每个密码的密码都会有盐.这是不正确的.好吧,我认为使用盐并让它给它是没有意义的蛮力和密码.因为这是正确的吗?"

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

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

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