相同的盐还是不同的盐?

Same salt or Different salt?

我有一个超旧版本的 php(请不要告诉我升级,因为在我们的情况下它永远不是一个选项)并且我需要存储密码。我看过像 php 的 this and many more that says, use crypt() 这样的帖子。我只是对一件事感到困惑:

我的问题是存储密码的正确方法是什么?对不同用户的所有密码使用一种相同的盐,还是对每个用户的密码使用不同的随机生成的盐?

我的问题出现了,因为根据我的经验,我没有在每一行中看到 database/table 加盐,有些在配置文件中有一个加盐,它被用于加盐所有密码.另外,我认为在每个用户中存储不同的盐只是意味着要存储更多的字节。

谢谢大家♥

您想使用不同的盐。这个想法是盐会影响生成的哈希值。

当"hacking"个密码被暴露后,恶意的人就会使用"rainbow tables"。这些本质上是一种反向查找,可以找到散列为给定值的字符串。普通密码也可以生成彩虹table

如果使用一种盐,黑客只需生成一道彩虹table。如果您为每个密码使用新盐,则黑客必须为他们希望泄露的每个密码生成彩虹 tables。

为现代哈希库(如 bcrypt)升级 PHP 是相关的。但是,我强烈推荐旧版本 PHP 的后向端口。密码的哈希函数被设计为计算量大,因此密码 需要时间 来验证。这个想法是您无法在任何合理的短时间内验证 1000 种不同的密码可能性。

对每个哈希使用单一盐将始终防止彩虹 table 攻击,除非使用您使用的盐生成专门生成的彩虹 table,这在天文学上是不可能的,除非您的盐是单个字符或事先已知。

对每个散列使用相同的盐也可以很好地防止黑客访问您的 SQL 数据库但不能访问您的后端代码。

但是,如果黑客可以访问您的静态盐,那么对于暴力攻击的速度来说,它几乎毫无用处,为每个用户提供盐会缓解这种情况。

您应该同时使用硬编码静态盐和动态盐来防止彩虹 table 攻击和减轻暴力攻击。

为每个密码创建一个唯一的盐,这是唯一安全的方法。如何计算哈希,取决于您的 PHP 版本实际是多少:

PHP 的 5.5 版将内置对 BCrypt 的支持,函数 password_hash() and password_verify()。此函数将自行生成安全盐并将其包含在生成的哈希值中。

对于 PHP 5.3.7 版及更高版本,存在 compatibility pack,来自制作 password_hash( ) 功能。然后您就可以使用 password_hash() 函数,如果您切换到更新的 PHP 版本,则无需更改代码。

对于 PHP 版本 5.3.7 之前,不支持带有 2y 的 crypt(),unicode 安全 BCrypt 算法。可以使用兼容包并将其替换为 2a,这是早期 PHP 版本的最佳选择。

对于 PHP 版本 5.3 之前,根本不支持 BCrypt。那时你最好的选择可能是 phpass framework

请注意,crypt() 函数 不会 自行创建安全盐,尽管它会将其包含在生成的哈希值中。为了验证,它将从那里提取它。