BCRYPT和随机SALTS一起在数据库中

时间:2012-05-20 19:34:59

标签: php mysql security encryption bcrypt

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

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

我应该使用纯文本的用户记录将SALT存储在数据库中吗?这也失败了吗?或者我应该使用md5散列盐并将其存储在数据库中?

实现此项并存储SALT时,最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

modular crypt format for bcrypt does already contain a 128 bit salt。因此,除非您使用与此不同的实现,否则您不需要另外的盐。

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


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

$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.'$');

答案 1 :(得分:2)

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