md5($password.md5($password))
这对密码哈希来说足够了吗?我不是要求比较这样的东西像bcrypt.
如果不安全,告诉我为什么.
据了解,您可以在密码表中使用四个级别的散列:
>无 – 将密码存储为纯文本.如果有人获取您的数据库的副本,他们可以访问所有帐户.纯文字不好,“妈妈?
哈希密码 – 存储密码的哈希,并丢弃真正的密码.如果有人获取您的数据库的副本,他们看不到任何密码,只能哈希.但是,如果任何用户使用弱密码,那么他们的哈希将出现在彩虹表中.例如,如果用户具有密码“password”,则存储在数据库中的md5哈希将为“5f4dcc3b5aa765d61d8327deb882cf99”.如果我在像the one at gromweb.com这样的彩虹表中查找那个哈希,就会吐出“密码”.
>使用盐值 – 选择一个大的随机字符串,如GUID,并将其存储在配置文件中.在计算哈希值之前,将该字符串附加到每个密码.现在彩虹表的可能性不大,因为它可能没有“password59fJepLkm6Gu5dDV”或“picard59fJepLkm6Gu5dDV”的条目.虽然预先计算的彩虹表不再有效,但如果攻击者知道您的盐值,您仍然可以很容易受到影响.攻击者可以计算弱密码和您的盐的哈希值,并查看数据库中的任何用户是否使用该密码.如果你有几千个用户,那么每个哈希计算都可以让攻击者进行数千次的比较.如何实际使用盐可能取决于您使用的加密算法.为了简单起见,只要想象它将盐和密码一起添加.
>使用不同的盐值 – 现在您将使用与用户名,电子邮件地址甚至用户标识不同的东西,并在计算哈希值之前将其与密码和大型随机字符串配置在配置文件中.现在,一个知道你的盐的攻击者还必须重新计算每个用户的哈希值,看看他们是否使用了一个弱密码,如“密码”.
有关详细信息,请查看编码恐怖帖子“You’re probably storing passwords incorrectly”.