1

我正在升级我的网站的安全级别。

在研究存储密码的最佳方法时,我在 PHP 5.3 中发现了 BCRYPT 选项。我已经实现了这个函数来使用静态 SALT,但是我读到每个密码都应该有不同的 SALT 或者违背了目的。

我应该将 SALT 与用户记录以纯文本形式存储在数据库中吗?这是否也违背了目的?或者我应该使用 md5 散列盐并将其存储在数据库中?

实现这个和存储 SALT 时最好的方法是什么?

4

2 回答 2

3

bcrypt的模块化 crypt 格式确实已经包含 128 位 salt。因此,除非您使用与此不同的实现,否则您不需要另一种盐。

请注意,盐的主要目的是使每个输入都是唯一的,因此查找表辅助字典攻击存储的值是不切实际的。


Jacco提醒我 PHP 的原生 bcrypt 实现crypt不会自动生成盐。所以你必须自己做,例如:

$salt = substr(str_replace('+', '.', base64_encode(call_user_func_array('pack', array_merge(array('H14N'), explode('.', uniqid('', true)))).pack('N2', mt_rand(), mt_rand()))), 0, 22);
$hash = crypt($password, '$2a$10$'.$salt.'$');
于 2012-05-21T07:38:54.963 回答
2

您应该为每个用户创建一个新的随机盐,并将其与哈希一起存储在数据库中。大多数 bcrypt 实现已经这样做了。如果您查看输出,您会看到它是一个$包含盐的分离值。

于 2012-05-20T19:38:03.767 回答