我有一个超级旧版本的PHP(请不要告诉我升级因为它永远不会是我们的选项)我需要存储密码。我曾经看过像this这样的帖子,还有更多的帖子,使用php的crypt()。我只是混淆了一件事:
我的问题是存储密码的正确方法;对于不同用户的所有密码使用ONE SAME SALT或为每个用户密码使用不同的随机生成的盐?
我的问题出现了,因为根据我的经验,我没有看到每行中有一个带有salt的数据库/表,有些在配置文件中有一个salt,它被用于盐化所有密码。此外,我认为在每个用户中存储不同的盐只意味着要存储更多的字节。
谢谢你们♥
答案 0 :(得分:3)
您想要使用不同的盐。想法是盐会影响产生的哈希值。
当“黑客”密码暴露时,恶意用户将使用“彩虹表”。这些本质上是一个反向查找,它查找散列到给定值的字符串。也可以为常用密码生成彩虹表。
如果你使用一种盐,黑客只需要生成一个彩虹表。如果你为每个密码使用一个新的盐,黑客必须为他们希望妥协的每个密码生成彩虹表。
升级现代哈希库(如bcrypt)的PHP是相关的。但是,我认真推荐使用旧版PHP的后端口。密码的散列函数设计成计算成本昂贵,因此密码需要时间来验证。这个想法是你无法在任何相当短的时间内验证1000种不同的密码可能性。
答案 1 :(得分:1)
为每个密码创建一个唯一的salt,这是唯一安全的方法。如何计算哈希值取决于PHP版本的实际存在年限:
PHP的5.5版将内置对BCrypt的支持,功能password_hash()和password_verify()。此函数将自己生成一个安全的salt,并将其包含在生成的哈希值中。
对于PHP 版本5.3.7及更高版本,存在compatibility pack,来自制作password_hash()函数的同一作者。您可以使用password_hash()函数,如果切换到较新的PHP版本,则无需更改代码。
对于5.3.7之前的PHP版本 ,不支持带有2y
的crypt(),即unicode安全的BCrypt算法。可以使用兼容包并将其替换为2a
,这是早期PHP版本的最佳替代方案。
对于5.3版之前的版本,根本不支持BCrypt。您最好的选择可能是phpass framework然后。
请注意,crypt()
函数将不自行创建一个安全的盐,但它会将其包含在生成的哈希值中。如需验证,它将从那里提取。
答案 2 :(得分:0)
对每个散列使用单个盐将始终防止彩虹表攻击,除非使用您正在使用的盐生成特殊生成的彩虹表,除非您的盐是单个字符或事先已知,否则这在天文学上是不可能的。
对每个哈希都使用相同的盐对于有权访问SQL数据库但不能访问后端代码的黑客也很有用。
然而,如果一个黑客可以访问你的静态盐,那么它对于蛮力攻击的速度几乎是无用的,这对于每个用户来说都会减少盐。
你应该同时使用硬编码的静态盐和动态盐来防止彩虹表攻击并缓解暴力攻击。