📜  PHP | crypt(), password_hash() 函数

📅  最后修改于: 2022-05-13 01:56:29.328000             🧑  作者: Mango

PHP | crypt(), password_hash() 函数

在上一篇关于 md5()、sha1() 和 hash() 函数的文章中,我们看到该方法的主要缺点之一是这些算法由于复杂性较低而速度非常快,因此更容易受到攻击,它们甚至建议不要在更重要的成熟项目中使用。因此, PHP现在提供了一些新方法来以更加优化和安全的方式散列用户密码。方法讨论如下:

crypt()函数

句法:

string crypt ($string, $salt)

参数:该函数最多需要两个参数,如下所示:

  • $ 字符串:这个参数期望字符串被散列。
  • $salt:根据定义,这是一个可选参数,但几乎从不希望将 salt 字段保留为未定义。 salt 参数期望将随机字符串用作散列的基础。许多开发人员倾向于使用一些特定字段和随机字符附加在一起的组合。

返回类型:此函数返回散列字符串。

由于 crypt() 比它的前辈更好,它被广泛使用,但该函数的可靠性值得怀疑,因此PHP现在提供了一个内置函数来服务于密码哈希的目的,推荐使用。

password_hash()函数

句法:

string password_hash($string, $algo, $options)

参数:该函数最多可以使用三个参数,如下所示:

  • $ 字符串:这个参数期望字符串被散列。
  • $algo:此参数需要一个整数值,该值是指用于该目的的算法。三种算法可用如下:
    • PASSWORD_DEFAULT:这是推荐的算法,因为PHP的开发团队正在添加新算法并更新以下算法以成为最佳选择。
    • PASSWORD_BCRYPT:此算法使用 CRYPT_BLOWFISH 算法并生成 crypt() 等效散列。
    • PASSWORD_ARGON2I:使用 Argon2 散列算法。
  • $options:这是一个可选参数,需要描述的高级选项数组。每种算法支持的选项略有不同。支持的选项如下:

    PASSWORD_BCRYPT 支持的选项

    • 成本:要应用的最大算法成本。默认值为 10。算法成本直接影响加载时间,并且很大程度上取决于运行的硬件。
    • Salt:开发人员也可以手动提供盐,但不推荐。

    PASSWORD_ARGON2I 支持的选项

    • 内存成本:用于生成哈希的最大内存成本。
    • 时间成本:计算哈希所需的最长时间。
    • 线程:要使用的线程数。

返回类型:此函数在成功或 FALSE 时返回散列字符串。

下面的程序说明了 crypt() 和 password_hash() 在PHP中的工作:

 10,
               'salt' => '$P27r06o9!nasda57b2M22'
           ];
             
echo sprintf("Result of crypt() on %s is %s\n", 
             $str, crypt($str, $options['salt']));
echo sprintf("Result of DEFAULT on %s is %s\n",
      $str, password_hash($str, PASSWORD_DEFAULT));
echo sprintf("Result of BCRYPT on %s is %s\n", $str, 
    password_hash($str, PASSWORD_BCRYPT, $options));
      
?>

输出:

Result of crypt() on Password is $PFKQN2rkmKu6
Result of DEFAULT on Password is $2y$10$yqFvDGy
v2Tz4d/A/yulbFe5ISH9oR3gvU7GQLMYRKR7XQJnGpQOau
Result of BCRYPT on Password is $2y$10$JFAyN3Iw
Nm85IW5hc2RhNOlEBYnR992.gf.5FqZhHSbln3a4jtQpi

需要注意的要点

  • 散列算法应该优选地是单向路径,即不应该存在解密方法,遵循这个概念,所描述的函数没有解密方法。
  • 没有任何解密方法,密码的验证需要对用户在登录时提供的每个输入进行加密,因此PHP提供了 password_verify()函数来验证相同的内容。
  • crypt() 和 password_hash() 都相互兼容。我们可以说 password_hash() 方法是对 crypt() 方法本身更加用户友好的包装。

参考

  • PHP 。 PHP
  • http:// PHP.net/manual/en/函数.crypt。 PHP