8

我正在考虑使用 password_hash() 函数来加密用户密码。我知道如果您不提供此功能,默认情况下会生成盐,甚至鼓励使用默认盐而不是您自己的盐。我目前正在权衡 3 个选项,无法决定选择哪一个,所以如果您能帮助我,我将不胜感激。

1. 选项:password_hash() 与默认盐

$passwordInput = $_POST['password'];
$passwordHash = password_hash($passwordInput, PASSWORD_BCRYPT);
//INSERT $passwordHash INTO DATABASE

2. 选项:password_hash() 和自定义盐

$options = ['salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)];
$passwordInput = $_POST['password'];
$passwordHash = password_hash($passwordInput, PASSWORD_BCRYPT, $options);
//INSERT $passwordHash INTO DATABASE

3. 选项:根本不使用 password_hash()

我将此选项基于 2014 年的一篇文章:基于表单的网站身份验证的权威指南。基本上,如果它是比 password_hash() 更安全的方法,我会使用这样的方法:

$salt = uniqid(rand(0, 1000000);
$passwordInput = $_POST['password'];
$password = hash('sha512', $salt . $passwordInput);
//INSERT $password AND $salt INTO DATABASE SEPARATELY
4

1 回答 1

13

这个问题的真正简短答案是使用password_hash()默认盐(您的第一个选项),自定义盐在 PHP7 中已弃用,因为引用 php.net:

password_hash() 函数的 salt 选项已被弃用,以防止开发人员生成自己的(通常是不安全的)盐。当开发人员没有提供盐时,该函数本身会生成加密安全的盐 - 因此不需要自定义盐生成。

出于同样的原因,hash()应该避免您的第三个选项,因为您需要再次生成自己的盐。

于 2015-11-12T13:57:11.187 回答