我正在升级我的网站的安全级别。
在研究存储密码的最佳方法时,我在 PHP 5.3 中发现了 BCRYPT 选项。我已经实现了这个函数来使用静态 SALT,但是我读到每个密码都应该有不同的 SALT 或者违背了目的。
我应该将 SALT 与用户记录以纯文本形式存储在数据库中吗?这是否也违背了目的?或者我应该使用 md5 散列盐并将其存储在数据库中?
实现这个和存储 SALT 时最好的方法是什么?
我正在升级我的网站的安全级别。
在研究存储密码的最佳方法时,我在 PHP 5.3 中发现了 BCRYPT 选项。我已经实现了这个函数来使用静态 SALT,但是我读到每个密码都应该有不同的 SALT 或者违背了目的。
我应该将 SALT 与用户记录以纯文本形式存储在数据库中吗?这是否也违背了目的?或者我应该使用 md5 散列盐并将其存储在数据库中?
实现这个和存储 SALT 时最好的方法是什么?
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.'$');
您应该为每个用户创建一个新的随机盐,并将其与哈希一起存储在数据库中。大多数 bcrypt 实现已经这样做了。如果您查看输出,您会看到它是一个$
包含盐的分离值。