PHP password_hash(),默认还是自定义盐?

Mar*_*sar 8 php passwords password-encryption php-password-hash

我正在考虑使用password_hash()函数来加密用户密码.我知道如果你没有提供它,这个函数会默认生成salt,甚至鼓励使用默认的salt而不是你自己的salt.我目前正在权衡3个选项,无法决定使用哪个,所以如果你能帮助我,我会很感激.

1.选项:password_hash(),默认为salt

$passwordInput = $_POST['password'];
$passwordHash = password_hash($passwordInput, PASSWORD_BCRYPT);
//INSERT $passwordHash INTO DATABASE
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

CD0*_*001 11

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

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

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