當前位置: 首頁> 最新文章列表> crypt() 函數的參數解析與使用實例

crypt() 函數的參數解析與使用實例

M66 2025-05-22

在PHP 中, crypt()函數是一個常用的加密函數,主要用於對字符串進行單向加密處理,特別是在處理密碼存儲時非常實用。本文將詳細解析crypt()函數的參數,並通過實例演示如何用PHP 的crypt()函數安全地加密字符串。

一、crypt() 函數簡介

crypt()是PHP 內置的一個加密函數,基於Unix 的crypt()函數實現。它使用不同的加密算法(如DES、MD5、Blowfish、SHA-256、SHA-512 等)對輸入字符串進行加密,返回加密後的字符串。

函數原型:

 string crypt ( string $str [, string $salt ] )
  • $str :需要加密的字符串,通常是密碼。

  • $salt (可選):用於指定加密算法及加鹽的字符串。不同的鹽決定了加密算法和結果。

二、crypt() 的參數解析

1. 字符串參數$str

這是待加密的明文字符串,通常是用戶的密碼。

2.鹽參數$ salt

鹽參數是決定加密算法和結果的關鍵。不同格式的鹽代表不同的算法:

  • 默認DES 加密<br> 長度為2 個字符的鹽,例如: "ab
    這是最原始的加密方式,安全性較弱,不推薦使用。

  • MD5 加密<br> 以$1$開頭,後接最多8 個字符的鹽,例如: "$1$m66net12$
    這會使用MD5 算法加密。

  • Blowfish 加密<br> 以$2a $ 、 $2y $ 、 $2b$等開頭,後面是2 位數字表示成本因子,和22 位的鹽,例如: "$2y$10$m66netsaltsaltsaltsa$
    Blowfish 是較為安全的算法。

  • SHA-256 加密<br> 以$5$開頭,後接鹽,例如: "$5$m66net$

  • SHA-512 加密<br> 以$6$開頭,後接鹽,例如: "$6$m66net$

3. 鹽的格式示例

// MD5 鹽示例
$salt_md5 = '$1$m66net12$';

// Blowfish 鹽示例,10 是成本因子(cost factor)
$salt_blowfish = '$2y$10$m66netsaltsaltsaltsa$';

// SHA-256 鹽示例
$salt_sha256 = '$5$m66net$';

// SHA-512 鹽示例
$salt_sha512 = '$6$m66net$';

三、crypt() 的使用示例

下面通過幾個實例來展示如何使用crypt()函數加密字符串。

1. 使用默認DES 加密(不推薦)

 $password = "mypassword";
$salt = "m6";  // 2字符鹽
$hashed = crypt($password, $salt);
echo "DES加密結果:" . $hashed;

2. 使用MD5 加密

$password = "mypassword";
$salt = '$1$m66net12$';  // 以 $1$ 開頭的鹽
$hashed = crypt($password, $salt);
echo "MD5加密結果:" . $hashed;

3. 使用Blowfish 加密

$password = "mypassword";
$salt = '$2y$10$m66netsaltsaltsaltsa$';  // Blowfish,成本10
$hashed = crypt($password, $salt);
echo "Blowfish加密結果:" . $hashed;

4. 使用SHA-512 加密

$password = "mypassword";
$salt = '$6$m66net$';
$hashed = crypt($password, $salt);
echo "SHA-512加密結果:" . $hashed;

四、密碼驗證示例

加密密碼後,驗證時要用相同的鹽重新加密輸入的密碼,然後對比結果是否相同。

 // 假設數據庫中保存的密碼哈希
$stored_hash = '$6$m66net$........';  // 从数据库取出的加密結果

// 用戶登錄時輸入的密碼
$input_password = "mypassword";

// 取出鹽,通常是 stored_hash 的前幾個部分,具體長度視算法而定
$salt = substr($stored_hash, 0, strrpos($stored_hash, '$') + 1);

// 用相同鹽重新加密輸入密碼
$input_hash = crypt($input_password, $salt);

if ($input_hash === $stored_hash) {
    echo "密碼驗證成功";
} else {
    echo "密碼驗證失敗";
}

五、小結

  • crypt()函數支持多種加密算法,通過鹽參數決定。

  • 推薦使用Blowfish ( $2y$ ) 或SHA-512 ( $6$ ) 算法,安全性更高。

  • 鹽必須隨機且唯一,且格式必須正確。

  • 密碼驗證時,使用加密後的哈希值中的鹽再次加密輸入密碼,然後比較。