在PHP 中處理密碼加密時, crypt()和password_hash()都可以用來生成密碼的哈希值,但這兩個函數有明顯的區別。在選擇加密函數時,理解它們各自的原理和優勢,對於確保應用的安全性至關重要。
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。
password_hash()是從PHP 5.5 開始引入的現代化密碼哈希函數。它默認使用bcrypt算法,並在較新的版本中還支持argon2i和argon2id (PHP 7.2 之後)。它專為密碼哈希而設計,自動管理鹽值和成本因子,極大地簡化了安全編碼工作。
$password = 'mySecretPassword';
$hash = password_hash($password, PASSWORD_DEFAULT); // 默認使用 bcrypt
生成的$hash是一個包含算法信息、成本和salt 的字符串,無需開發者手動設置。
特性 | crypt() | password_hash() |
---|---|---|
鹽值管理 | 需開發者手動設置 | 自動生成 |
演算法 | 多種,需指定 | 默認bcrypt ,支持argon2 |
安全性 | 取決於實現和配置 | 默認安全,遵循最佳實踐 |
易用性 | 複雜,易出錯 | 簡單,易於使用 |
推薦程度 | 不推薦用於新項目 | 強烈推薦 |
password_hash()使用的算法專為哈希密碼而設計(如bcrypt和argon2 ),能抵抗現代密碼破解技術,如GPU 加速攻擊。
使用PASSWORD_DEFAULT常量,PHP 可以自動切換到更安全的算法而無需更改代碼。例如:
$hash = password_hash($password, PASSWORD_DEFAULT);
隨著PHP 的更新, PASSWORD_DEFAULT會自動採用更強的算法,比如從bcrypt切換到argon2id 。
由於password_hash()自動處理鹽值和成本因子,它大幅減少了因為人為設置錯誤而造成的安全問題。
如果你在構建一個用戶認證系統,例如以下形式的註冊處理腳本:
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 應用。