PHP密码哈希(),默认或自定义盐? [复制]

Posted

技术标签:

【中文标题】PHP密码哈希(),默认或自定义盐? [复制]【英文标题】:PHP password_hash(), default or custom salt? [duplicate] 【发布时间】: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 太快了。获得哈希访问权限的攻击者可以通过密码猜测攻击快速运行它们。这篇文章在这方面是错误的。 【参考方案1】:

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

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

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

【讨论】:

这很好,但让我困惑的是:如果系统生成自己的盐,我们不知道盐是什么。如果我们不能将销售与密码哈希一起存储,我们如何检查发布的密码是否正确?在不知道盐的情况下,我们无法再次创建相同的哈希。 @Ade 盐 is 与散列一起存储,请查看文档中的 Return Values 部分:- “使用的算法、成本和盐是作为散列的一部分返回。因此,验证散列所需的所有信息都包含在其中。" 谢谢,是的,我最初并没有看到还有 password_verify() 函数 - 这可以解决所有问题。

以上是关于PHP密码哈希(),默认或自定义盐? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

加盐密码哈希:如何正确使用

密码哈希和盐如何存储在 Symfony 数据库中?

C# 中的哈希和盐密码

[Sql-Server]密码盐和哈希值使用啥数据类型以及啥长度?

加盐哈希以验证明文(不是密码)

用户名、密码、加盐、加密、哈希 - 这一切是如何工作的? [复制]