當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。