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

PHP 字串加密解密實作:對稱加密演算法與最佳實踐

     編輯:PHP 相關知識

PHP 字串加密解密實作:從簡單 XOR 到現代 AES-GCM 標準

本文展示從教學用簡單 XOR 加密、進階可逆加密,到生產環境標準的 AES-256-GCM 認證加密完整實作,附金鑰管理、IV/Nonce 處理、常見陷阱。

第一代:教學用簡單 XOR 加密 (不可用於生產)

缺陷:無完整性驗證 (可被篡改)、金鑰派生弱 (MD5)、無 IV 導致相同明文產生相同密文、抗暴力破解極弱。

第二代:改進版可逆加密 (含隨機 IV、Base64 封裝)

改進:隨機 IV、OpenSSL 標準實作。缺陷:CBC 模式無認證 (Padding Oracle 攻擊)、金鑰派生仍用 MD5。

第三代:生產環境標準 — AES-256-GCM 認證加密 (PHP 7.1+)

 'sk-xxx', 'secret' => 'ssn-123-45-6789'];
$plaintext = json_encode($data);
$aad = 'user_id:12345|purpose:api_credentials';  // 綁定上下文

try {
    $encrypted = ModernCrypto::encrypt($plaintext, $password, $aad);
    echo "加密結果: $encrypted\n";
    
    // 存儲 $encrypted 到資料庫...
    
    // 解密 (需相同 password 與 aad)
    $decrypted = ModernCrypto::decrypt($encrypted, $password, $aad);
    echo "解密結果: $decrypted\n";
    print_r(json_decode($decrypted, true));
} catch (Exception $e) {
    echo "錯誤: " . $e->getMessage();
}

關鍵安全點總表

要素錯誤做法正確做法
金鑰來源直接用密碼、MD5(密碼)PBKDF2/Argon2/Scrypt + 隨機 Salt
IV/Nonce固定、全零、重複使用每次加密 random_bytes() 產生唯一值
模式ECB、CBC 無認證GCM/CCM/OCB (AEAD 認證加密)
完整性無驗證,直接解密GCM 自動驗證 Tag,失敗拋出異常
關聯資料不使用AAD 綁定上下文 (用戶 ID、用途、版本)
金鑰輪換永不更換定期輪換,舊資料重新加密或標記版本

常見場景對應方案

  • 資料庫欄位加密:AES-256-GCM + 欄位級金鑰 (由主金鑰派生)
  • API Token 加密儲存:上述 ModernCrypto 類
  • 密碼儲存:不可逆雜湊 — password_hash($pwd, PASSWORD_ARGON2ID) / PASSWORD_BCRYPT,絕不加密
  • 大檔案加密:分塊串流加密 (GCM-SIV 或 ChaCha20-Poly1305),避免記憶體溢出
  • 跨語言相容:使用標準格式 (如 JWE、PASETO)

PHP 版本需求

  • openssl_encrypt/decrypt GCM 支援:PHP 7.1+
  • hash_pbkdf2:PHP 5.5+
  • random_bytes:PHP 7.0+ (5.x 需 paragonie/random_compat)
  • 建議最低 PHP 7.4+,理想 PHP 8.1+
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved