在PHP 中, crypt()函數是一個常用的加密函數,主要用於對字符串進行單向加密處理,特別是在處理密碼存儲時非常實用。本文將詳細解析crypt()函數的參數,並通過實例演示如何用PHP 的crypt()函數安全地加密字符串。
crypt()是PHP 內置的一個加密函數,基於Unix 的crypt()函數實現。它使用不同的加密算法(如DES、MD5、Blowfish、SHA-256、SHA-512 等)對輸入字符串進行加密,返回加密後的字符串。
函數原型:
string crypt ( string $str [, string $salt ] )
$str :需要加密的字符串,通常是密碼。
$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$
// 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()函數加密字符串。
$password = "mypassword";
$salt = "m6"; // 2字符鹽
$hashed = crypt($password, $salt);
echo "DES加密結果:" . $hashed;
$password = "mypassword";
$salt = '$1$m66net12$'; // 以 $1$ 開頭的鹽
$hashed = crypt($password, $salt);
echo "MD5加密結果:" . $hashed;
$password = "mypassword";
$salt = '$2y$10$m66netsaltsaltsaltsa$'; // Blowfish,成本10
$hashed = crypt($password, $salt);
echo "Blowfish加密結果:" . $hashed;
$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$ ) 算法,安全性更高。
鹽必須隨機且唯一,且格式必須正確。
密碼驗證時,使用加密後的哈希值中的鹽再次加密輸入密碼,然後比較。