当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


PHP crypt(), password_hash()用法及代码示例


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

crypt() Function

用法:


string crypt ($string, $salt)

参数:该函数最多占用两个参数,如下所示:

  • $string:此参数要求对字符串进行哈希处理。
  • $salt:根据定义,这是一个可选参数,但是几乎永远不会使salt字段保持未定义状态。 salt参数期望将随机字符串用作哈希的基础。许多开发人员倾向于结合使用某些特定字段和随机字符的组合。

返回类型:此函数返回哈希字符串。

由于crypt()比其以前的产品要好,因此被广泛使用,但是该函数的可靠性值得怀疑,因此PHP现在提供了内置函数来实现密码哈希,并建议使用。

password_hash()函数

用法:

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

参数:该函数最多最多占用三个参数,如下所示:

  • $string:此参数要求对字符串进行哈希处理。
  • $algo:此参数需要一个整数值,该整数值表示用于此目的算法。三种算法如下:
    • PASSWORD_DEFAULT:这是推荐的算法,因为PHP的开发人员团队正在添加新算法,并将以下内容更新为最佳选择。
    • PASSWORD_BCRYPT:此算法使用CRYPT_BLOWFISH算法并生成crypt()等效哈希。
    • PASSWORD_ARGON2I:使用Argon2哈希算法。
  • $options:这是一个可选参数,期望使用所述的一系列高级选项。每种算法支持的选项略有不同。支持的选项如下:

    PASSWORD_BCRYPT支持的选项

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

    PASSWORD_ARGON2I的受支持选项

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

返回类型:成功或为FALSE时,此函数返回哈希字符串。

以下示例程序旨在说明PHP中crypt()和password_hash()的工作:

<?php 
  
// PHP code to illustrate the working of  
// crypt() and password_hash() 
  
$str = 'Password'; 
$options = [ 
               'cost' => 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

注意事项

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

参考:



相关用法


注:本文由纯净天空筛选整理自PronabM大神的英文原创作品 PHP | crypt(), password_hash() Functions。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。