在現代Web 應用開發中,用戶密碼的安全存儲至關重要。 PHP 內置的crypt()函數支持多種加密算法,其中就包括Blowfish 加密算法。 Blowfish 算法以其高強度和可定制的工作因子(cost)被廣泛用於密碼哈希。本文將詳細介紹如何利用PHP 的crypt()函數使用Blowfish 算法(標識符為$2y$ )對密碼進行安全加密。
Blowfish 是一種對稱密鑰加密算法,專門設計用於替代較舊的加密算法。針對密碼哈希,Blowfish 以其可調節的“工作因子”提供了良好的防暴力破解能力,工作因子越高,計算加密所需時間越長,從而提高密碼安全性。
PHP 的crypt()函數使用$2y$標識符表示Blowfish 哈希格式,這是PHP 5.3.7 及以上版本推薦使用的格式,能避免早期版本的安全問題。
Blowfish 算法的鹽是一個22 字符的字符串,包含az , AZ , 0-9 , . , /共64 個字符。 PHP 的crypt()要求鹽格式如下:
$2y$ + 兩位工作因子(cost) + $ + 22 位鹽
例如:
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
這裡, 12是工作因子,代表2^12 次哈希計算,約等於4096 次,既安全又不會太慢。
$password = 'your_password_here';
$hash = crypt($password, $salt);
返回的$hash是一個完整的Blowfish 哈希字符串,可以直接存入數據庫。
驗證密碼時,直接使用原哈希作為鹽調用crypt() ,比較結果即可:
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
<?php
// 生成安全鹽
function generate_blowfish_salt($cost = 12) {
if ($cost < 4 || $cost > 31) {
throw new InvalidArgumentException("工作因子必須在4到31之間");
}
$randomBytes = random_bytes(16);
$base64Salt = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64Salt);
}
// 加密密碼
function encrypt_password($password, $cost = 12) {
$salt = generate_blowfish_salt($cost);
return crypt($password, $salt);
}
// 驗證密碼
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
// 測試
$password = 'mypassword123';
$hash = encrypt_password($password);
echo "密碼哈希: $hash\n";
if (verify_password('mypassword123', $hash)) {
echo "密碼驗證成功!\n";
} else {
echo "密碼驗證失敗!\n";
}
?>