我是否必须生成额外的盐,即使 password_hash() 已经提供了盐?
Must I generate an additional salt, even though password_hash() already provides a salt?
在使用 PHP 的原生 password_hash() 函数时,我必须(或应该)生成自己的盐,尽管(据我所知),它已经可以创建一个盐,如图所示在这个例子中(由 http://www.php.net 提供):
<?php
/**
* Note that the salt here is randomly generated.
* Never use a static salt or one that is not randomly generated.
*
* For the VAST majority of use-cases, let password_hash generate the salt randomly for you
*/
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>
目前我一直在使用 sha512 进行哈希处理并生成 38,500 个字符的盐。 (我不确定字符数是否真的很重要,所以我还是尝试了......它似乎有效,因为它允许我成功注册和登录用户,但我不知道这的全部安全漏洞)
像这样:
<?php
$Salt = str_repeat(hash("sha512", uniqid(time())), 40);
?>
很奇怪,但说到密码学,我还有很多东西要学。
(这里是 link 到其中一种盐 https://shrib.com/F7lB9Ycf)
现在,如果我要添加额外的盐(如果您说是,再次添加盐),那么我将如何使用 password_verify()?
添加盐
在此先感谢任何可以提供帮助的人!
password_hash()
生成自己的盐。无需从 PHP Reference 中加盐 again.See: 如果省略,password_hash() 将为每个散列密码生成随机加盐。这是预期的操作模式。
您应该不生成您自己的盐,因为函数password_hash()使用操作系统的随机源尽可能地做到了这一点。换句话说,您将无法生成更好的盐,尽管您可以做得更糟。
// Leave out a salt in the options
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
生成38500个字符的salt绝对没有优势。根据盐的添加方式,当您使用具有最大密码长度的算法(如 BCrypt 所做的)时,它甚至会降低安全性。通常一个盐大约是20个字节。
盐应该可以保护您免受彩虹-table 攻击。必须为这种盐构建 rainbow-table,因为现在不可能强制使用随机的 20+ 密码。如果为每个密码添加一个唯一的盐,攻击者就必须为每个密码构建一个 rainbow-table。如果您对更多信息感兴趣,可以查看我的 tutorial 关于安全存储密码的内容。
在使用 PHP 的原生 password_hash() 函数时,我必须(或应该)生成自己的盐,尽管(据我所知),它已经可以创建一个盐,如图所示在这个例子中(由 http://www.php.net 提供):
<?php
/**
* Note that the salt here is randomly generated.
* Never use a static salt or one that is not randomly generated.
*
* For the VAST majority of use-cases, let password_hash generate the salt randomly for you
*/
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>
目前我一直在使用 sha512 进行哈希处理并生成 38,500 个字符的盐。 (我不确定字符数是否真的很重要,所以我还是尝试了......它似乎有效,因为它允许我成功注册和登录用户,但我不知道这的全部安全漏洞) 像这样:
<?php
$Salt = str_repeat(hash("sha512", uniqid(time())), 40);
?>
很奇怪,但说到密码学,我还有很多东西要学。 (这里是 link 到其中一种盐 https://shrib.com/F7lB9Ycf) 现在,如果我要添加额外的盐(如果您说是,再次添加盐),那么我将如何使用 password_verify()?
添加盐在此先感谢任何可以提供帮助的人!
password_hash()
生成自己的盐。无需从 PHP Reference 中加盐 again.See: 如果省略,password_hash() 将为每个散列密码生成随机加盐。这是预期的操作模式。
您应该不生成您自己的盐,因为函数password_hash()使用操作系统的随机源尽可能地做到了这一点。换句话说,您将无法生成更好的盐,尽管您可以做得更糟。
// Leave out a salt in the options
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
生成38500个字符的salt绝对没有优势。根据盐的添加方式,当您使用具有最大密码长度的算法(如 BCrypt 所做的)时,它甚至会降低安全性。通常一个盐大约是20个字节。
盐应该可以保护您免受彩虹-table 攻击。必须为这种盐构建 rainbow-table,因为现在不可能强制使用随机的 20+ 密码。如果为每个密码添加一个唯一的盐,攻击者就必须为每个密码构建一个 rainbow-table。如果您对更多信息感兴趣,可以查看我的 tutorial 关于安全存储密码的内容。