當前位置: 首頁> 最新文章列表> 如何使用PHP 的crypt() 函數實現Blowfish 加密算法($2y$)進行安全加密?

如何使用PHP 的crypt() 函數實現Blowfish 加密算法($2y$)進行安全加密?

M66 2025-06-23

在現代Web 應用開發中,用戶密碼的安全存儲至關重要。 PHP 內置的crypt()函數支持多種加密算法,其中就包括Blowfish 加密算法。 Blowfish 算法以其高強度和可定制的工作因子(cost)被廣泛用於密碼哈希。本文將詳細介紹如何利用PHP 的crypt()函數使用Blowfish 算法(標識符為$2y$ )對密碼進行安全加密。

什麼是Blowfish 加密算法?

Blowfish 是一種對稱密鑰加密算法,專門設計用於替代較舊的加密算法。針對密碼哈希,Blowfish 以其可調節的“工作因子”提供了良好的防暴力破解能力,工作因子越高,計算加密所需時間越長,從而提高密碼安全性。

PHP 的crypt()函數使用$2y$標識符表示Blowfish 哈希格式,這是PHP 5.3.7 及以上版本推薦使用的格式,能避免早期版本的安全問題。

使用PHP 的crypt() 函數進行Blowfish 加密

1. 生成鹽(salt)

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 次,既安全又不會太慢。

2. 使用crypt() 函數加密密碼

$password = 'your_password_here';
$hash = crypt($password, $salt);

返回的$hash是一個完整的Blowfish 哈希字符串,可以直接存入數據庫。

3. 驗證密碼

驗證密碼時,直接使用原哈希作為鹽調用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";
}
?>

相關鏈接