我应该从自定义随机生成的方法中将盐添加到我的哈希密码吗?PHP

Bal*_*nas 2 php hash password-protection

我正在创建一个带数据库的登录系统,并想询问散列密码.我目前在PHP中使用函数password_hash(),另外我添加了一个20个字符的自定义随机字符串.看起来像这样:

 $salt = generateRandomString();
 $hashedPwd = password_hash($pwd + $salt, PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)

功能:

function generateRandomString($length = 20) {
   $characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+{}|[]/?~`';
   $charactersLength = strlen($characters);
   $randomString = '';
   for ($i = 0; $i < $length; $i++) {
       $randomString .= $characters[rand(0, $charactersLength - 1)];
   }
   return $randomString;
Run Code Online (Sandbox Code Playgroud)

我稍后也会将随机字符串发送到数据库,并在登录时将其与密码一起验证.

我的问题是我是否需要额外的字符串?请记住,我希望它尽可能安全.

Fun*_*ner 5

首先,不要在散列/存储过程中生成随机字符串并将其包含在内.

它将password_verify()在验证期间失败,因为它不会知道添加的盐是什么,因为它不是其核心过程的一部分.

我的问题是我是否需要额外的字符串?

答:不,我上面已经说过了.

为什么?首先它不会起作用,而且不需要它.

password_hash() 自己生成.

如果你真的想要添加自己的盐,那么删除你正在使用的方法添加到哈希.它列在手册中.

你应该小心,因为,我引用:

" 警告自PHP 7.0.0起,salt选项已被弃用.现在,最好只使用默认生成的salt."

注意:您应该注意手册注释中的警告:

警告

强烈建议您不要为此功能生成自己的盐.如果您没有指定,它将自动为您创建安全盐.

如上所述,在PHP 7.0中提供salt选项将生成弃用警告.在将来的PHP版本中,可能会删除对手动提供salt的支持.

既然你似乎是新人; 如果您尚未使用预准备语句来存储和检索数据,那么我强烈建议您考虑使用它们.

它将有助于防止可能的SQL注入.


请记住,我希望它尽可能安全.

您可以使用PHP 7.2.0中引入的东西,即Argon2.

有关此问题的更多信息,请参阅以下内容:

它没有那么安全.