在使用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);
?>
非常奇怪,但在加密方面,我需要学习很多东西。 (这里是其中一个盐https://shrib.com/F7lB9Ycf)的链接 现在,如果我要添加一个额外的盐(如果你要说是,再次加盐),那么我将如何使用password_verify()附加盐?
提前感谢任何可以提供帮助的人!
答案 0 :(得分:1)
你应该不生成自己的salt,因为函数password_hash()使用操作系统的随机源尽可能做到最好。换句话说,虽然你可以做得更糟,但你无法生成更好的盐。
// Leave out a salt in the options
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
生成具有38500个字符的盐绝对没有优势。根据盐的添加方式,当您使用密码最大长度的算法时,甚至可能会降低安全性(如BCrypt所做)。通常盐约为20个字节。
盐应该保护你免受彩虹表攻击。必须为这种盐构建彩虹表,因为现在不可能强制使用随机的20+密码。如果为每个密码添加唯一的salt,则攻击者必须为每个密码构建一个rainbow-table。如果您对更多信息感兴趣,可以查看我的tutorial关于安全存储密码的信息。
答案 1 :(得分:0)
password_hash()
生成自己的盐。不需要再次加盐。从PHP Reference看到:如果省略,每个密码哈希值都会通过password_hash()生成一个随机盐。这是预期的操作模式。