在開發簡單的用戶系統時,密碼的加密存儲是安全的基礎之一。 PHP 提供了一個非常實用的加密函數crypt() ,可以幫助我們快速實現基本的密碼加密與驗證功能。本文將通過一個簡明的示例介紹如何使用crypt()函數構建一個簡單的用戶驗證系統。
crypt()是PHP 中用於單向字符串加密的函數,通常用於密碼加密。其基本語法如下:
string crypt(string $string, string $salt)
其中$string是需要加密的字符串, $salt是用來影響加密結果的“鹽”值,支持多種加密算法(如Blowfish、MD5、SHA-256、SHA-512 等)。
用戶註冊時,需要將密碼加密後存儲。以下是一個簡單的註冊示例:
<?php
// 用戶輸入的密碼
$password = 'user_password123';
// 使用 Blowfish 算法生成加密密碼
$hash = crypt($password, '$2y$10$' . bin2hex(random_bytes(11)));
// 模擬保存到數據庫
file_put_contents('users.txt', "username:$hash\n");
echo "用戶已註冊,密碼已加密保存。";
?>
在這裡,我們使用了$2y$10$開頭的salt 前綴,這表示使用Blowfish 算法(推薦用於密碼加密)。 random_bytes(11)生成一個隨機的鹽值,確保每次加密結果不同,即使密碼相同。
用戶登錄時,需將輸入的密碼使用相同的salt 加密,然後與數據庫中的密碼哈希進行比對:
<?php
// 用戶輸入
$input_username = 'username';
$input_password = 'user_password123';
// 從“資料庫”讀取信息
$data = file('users.txt');
foreach ($data as $line) {
list($stored_username, $stored_hash) = explode(':', trim($line));
if ($input_username === $stored_username) {
// 使用存儲的 hash 作為 salt 再加密一次輸入的密碼
if (crypt($input_password, $stored_hash) === $stored_hash) {
echo "登錄成功,歡迎回來 $input_username!";
} else {
echo "密碼錯誤。";
}
exit;
}
}
echo "用戶不存在。";
?>
這樣,即使攻擊者竊取了密碼哈希,也無法直接從哈希中還原原始密碼。同時,由於每個用戶使用不同的salt,即使多個用戶使用相同密碼,存儲的哈希值也不同。
雖然crypt()能提供基本的安全性,但PHP 從5.5 起推薦使用password_hash()和password_verify() ,它們在底層依然使用crypt() ,但封裝更完善且更安全。
但在某些限制環境中(例如舊服務器或必須手動控制salt 的系統), crypt()依然是一個有效的工具。
通過以上內容我們可以看到,使用PHP 的crypt()函數可以快速構建一個簡單的用戶驗證系統:
註冊時加密密碼並存儲;
登錄時使用相同的鹽值重新加密密碼並對比;
結合隨機鹽提升加密強度,防止彩虹表攻擊。
雖然對於現代項目更推薦使用password_hash() ,但理解crypt()的底層機制依然非常有幫助,尤其是在需要低層自定義時。