當前位置: 首頁> 最新文章列表> crypt() 與password_hash() 有何區別?

crypt() 與password_hash() 有何區別?

M66 2025-05-20

在PHP 中處理密碼加密時, crypt()password_hash()都可以用來生成密碼的哈希值,但這兩個函數有明顯的區別。在選擇加密函數時,理解它們各自的原理和優勢,對於確保應用的安全性至關重要。

1. crypt()函數概述

crypt()是一個歷史悠久的加密函數,可以追溯到Unix 系統。它支持多種加密算法(如DES、MD5、SHA-256、SHA-512),具體取決於你提供的鹽值(salt)和系統支持的算法。

示例:

 $password = 'mySecretPassword';
$salt = '$6$rounds=5000$anexamplesaltstring$'; // 使用 SHA-512
$hash = crypt($password, $salt);

生成的$hash會根據提供的salt 格式選擇加密算法。在這個例子中使用的是SHA-512。

2. password_hash()函數概述

password_hash()是從PHP 5.5 開始引入的現代化密碼哈希函數。它默認使用bcrypt算法,並在較新的版本中還支持argon2iargon2id (PHP 7.2 之後)。它專為密碼哈希而設計,自動管理鹽值和成本因子,極大地簡化了安全編碼工作。

示例:

 $password = 'mySecretPassword';
$hash = password_hash($password, PASSWORD_DEFAULT); // 默認使用 bcrypt

生成的$hash是一個包含算法信息、成本和salt 的字符串,無需開發者手動設置。

3. 核心區別對比

特性crypt() password_hash()
鹽值管理需開發者手動設置自動生成
演算法多種,需指定默認bcrypt ,支持argon2
安全性取決於實現和配置默認安全,遵循最佳實踐
易用性複雜,易出錯簡單,易於使用
推薦程度不推薦用於新項目強烈推薦

4. 為什麼選擇password_hash()更合適?

? 更強的安全性

password_hash()使用的算法專為哈希密碼而設計(如bcryptargon2 ),能抵抗現代密碼破解技術,如GPU 加速攻擊。

? 更高的可維護性

使用PASSWORD_DEFAULT常量,PHP 可以自動切換到更安全的算法而無需更改代碼。例如:

 $hash = password_hash($password, PASSWORD_DEFAULT);

隨著PHP 的更新, PASSWORD_DEFAULT會自動採用更強的算法,比如從bcrypt切換到argon2id

? 更少出錯

由於password_hash()自動處理鹽值和成本因子,它大幅減少了因為人為設置錯誤而造成的安全問題。

5. 與URL 相關的應用場景

如果你在構建一個用戶認證系統,例如以下形式的註冊處理腳本:

 if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $password = $_POST['password'];
    $hash = password_hash($password, PASSWORD_DEFAULT);

    // 保存到數據庫
    $conn = new PDO('mysql:host=localhost;dbname=example', 'user', 'pass');
    $stmt = $conn->prepare('INSERT INTO users (username, password) VALUES (?, ?)');
    $stmt->execute([$_POST['username'], $hash]);

    header('Location: https://m66.net/login-success');
}

在這種情況下,使用password_hash()明顯更安全、更現代,並能長期維持系統的安全性和可維護性。

結論

雖然crypt()仍然可以使用,但從安全性、易用性和未來可維護性角度考慮, password_hash()是更合適的選擇。特別是在處理用戶密碼的場景中,應優先採用password_hash()搭配password_verify()來驗證用戶輸入,構建更安全的PHP 應用。