【发布时间】:2016-02-13 20:41:15
【问题描述】:
我正在考虑使用 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 年的帖子:The definitive guide to form-based website authentication。基本上,如果它是一种比 password_hash() 更安全的方法,我会使用这样的方法:
$salt = uniqid(rand(0, 1000000);
$passwordInput = $_POST['password'];
$password = hash('sha512', $salt . $passwordInput);
//INSERT $password AND $salt INTO DATABASE SEPARATELY
【问题讨论】:
-
似乎记得在更新日志中读到过 PHP7 中完全不推荐使用 salt 选项 - 所以最好使用自动生成的 salt:php.net/manual/en/migration70.deprecated.php(靠近页面底部)
-
选项 3 不好。没有诸如 bcrypt 之类的 KDF 的 SHA-512 太快了。获得哈希访问权限的攻击者可以通过密码猜测攻击快速运行它们。这篇文章在这方面是错误的。
标签: php passwords password-encryption php-password-hash