首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 數據加密技術詳解:從單向哈希到對稱加密實戰

     編輯:PHP 相關知識

密碼學基礎回顧

  • 加密:明文 → 密文 (可逆,需密鑰)。
  • 哈希/單向加密:明文 → 固定長度摘要 (不可逆,驗證完整性、存儲密碼)。
  • 鹽值:隨機數據輸入哈希,防彩虹表攻擊、相同密碼產生不同哈希。

PHP 核心加密函數族

1. crypt() - 經典單向哈希 (PHP 3+)

string crypt(string $input_string [, string $salt])
  • 支持算法由系統 C 库決定:DES (2字符鹽)、MD5 ($1$ 12字符)、Blowfish ($2a$ 16字符)、SHA-256/512 ($5$/$6$)。
  • 檢測支持:CRYPT_SALT_LENGTH, CRYPT_MD5, CRYPT_BLOWFISH 等常量。
  • 驗證密碼:將用戶輸入密碼與存儲的完整哈希 (含鹽值、算法標識) 作為鹽值傳給 crypt(),比較結果。

2. 密碼哈希 API (PHP 5.5+ 強烈推薦)

$hash = password_hash("mypassword", PASSWORD_DEFAULT); // 自動選擇最強算法 (bcrypt/argon2)、生成鹽值
if (password_verify("user_input", $hash)) { /* 成功 */ }
// 算法升級檢查
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    $newHash = password_hash("user_input", PASSWORD_DEFAULT); // 更新存儲
}

**優勢**:自動處理鹽值、算法標識、成本因子,防止時序攻擊,未來兼容。

3. Mcrypt / OpenSSL - 對稱/非對稱加密 (可逆)

  • Mcrypt:PHP 7.1 棄用,7.2 移除 (移至 PECL)。
  • OpenSSL:現代標準。openssl_encrypt()/decrypt() 支持 AES, ChaCha20 等;openssl_pkey_new() 生成 RSA/ECC 密鑰對。

實戰:用戶認證系統密碼存儲

<?php
// 註冊/修改密碼
$hash = password_hash($_POST['password'], PASSWORD_ARGON2ID); // PHP 7.2+ 推薦 Argon2id
// 存入數據庫: $hash (包含算法、成本、鹽值)

// 登錄驗證
$stmt = $pdo->prepare("SELECT password_hash FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);
$row = $stmt->fetch();
if ($row && password_verify($_POST['password'], $row['password_hash'])) {
    // 登錄成功
    if (password_needs_rehash($row['password_hash'], PASSWORD_ARGON2ID)) {
        // 重新哈希並更新數據庫
    }
}
?>

常見誤區與避坑

  1. MD5/SHA1 存儲密碼:極快、無鹽、易碰撞,**嚴禁用於密碼**。
  2. 自定義加密算法:crypt($pass, substr($pass,0,2)) 等自創方案極不安全。
  3. 雙向加密存儲密碼:一旦密鑰洩露,所有密碼瞬間解密。**密碼只能哈希**。
  4. 忽略時序攻擊:字符串比較使用 hash_equals() (PHP 5.6+),password_verify 內部已處理。

總結

現代 PHP 開發:**密碼存儲只用 password_hash()/password_verify()**;數據加密傳輸/存儲用 openssl_encrypt() (AES-GCM/ChaCha20-Poly1305) 並妥善管理密鑰 (環境變量、KMS、HSM);簽名驗證用 hash_hmac() 或非對稱簽名。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved