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

PHP OpenSSL 加密擴充完整教學:對稱/非對稱加密、數位簽名與實戰應用

     編輯:PHP 相關知識

PHP OpenSSL 擴充深度解析:企業級加密解決方案實作

資料安全是現代應用核心需求。PHP OpenSSL 擴充封裝了業界標準的 OpenSSL 庫,提供對稱加密、非對稱加密、數位簽名等完整密碼學功能。本文系統性講解核心概念、API 使用與實戰最佳實踐。

加密基礎知識體系

類型演算法範例特點適用場景
對稱加密AES-256-CBC, DES, 3DES速度快、金鑰管理難大量資料加密、資料庫欄位加密
非對稱加密RSA, DSA, ECC金鑰分離、速度慢金鑰交換、數位簽名、身分驗證
雜湊/簽名SHA-256, MD5, HMAC單向、固定長度完整性驗證、密碼儲存、API 簽名

對稱加密實作

// 取得支援的加密方法
$methods = openssl_get_cipher_methods();
// 常用:aes-256-cbc, aes-128-gcm, chacha20-poly1305

$data = '敏感資料內容';
$method = 'aes-256-cbc';
$key = '32字元長度的金鑰123456789012'; // 32 bytes for AES-256
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));

// 加密
$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
// 儲存時建議:base64_encode($iv . $encrypted)

// 解密
$decrypted = openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);

關鍵參數:

  • OPENSSL_RAW_DATA:回傳原始二進位資料(預設 base64)
  • IV (Initialization Vector):每次加密必須使用隨機 IV,確保語義安全性
  • GCM 模式:提供認證加密(AEAD),推薦用於新專案

非對稱加密實作

// 產生金鑰對
$config = [
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
];
$resource = openssl_pkey_new($config);
openssl_pkey_export($resource, $privateKey);
$publicKey = openssl_pkey_get_details($resource)['key'];

// 公鑰加密、私鑰解密
openssl_public_encrypt($data, $encrypted, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);
openssl_private_decrypt($encrypted, $decrypted, $privateKey, OPENSSL_PKCS1_OAEP_PADDING);

// 私鑰加密(簽名)、公鑰解密(驗證)
openssl_private_encrypt($data, $signed, $privateKey);
openssl_public_decrypt($signed, $verified, $publicKey);

大資料分塊加密(RSA 限制)

function rsaEncryptLarge($data, $publicKey, $keySize = 2048) {
    $chunkSize = $keySize / 8 - 42; // OAEP padding 預留空間
    $encrypted = '';
    
    for ($offset = 0; $offset < strlen($data); $offset += $chunkSize) {
        $chunk = substr($data, $offset, $chunkSize);
        openssl_public_encrypt($chunk, $encryptedChunk, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);
        $encrypted .= $encryptedChunk;
    }
    
    return $encrypted;
}

數位簽名與驗證

// 簽名
$algo = 'sha256WithRSAEncryption'; // 或 OPENSSL_ALGO_SHA256
openssl_sign($data, $signature, $privateKey, $algo);

// 驗證
$result = openssl_verify($data, $signature, $publicKey, $algo);
// 1 = 成功, 0 = 失敗, -1 = 錯誤

實戰應用:API 請求簽名驗證

class ApiSigner {
    private $privateKey;
    private $publicKey;
    
    public function signRequest(array $params): array {
        // 1. 參數排序
        ksort($params);
        $query = http_build_query($params);
        
        // 2. 產生簽名
        openssl_sign($query, $signature, $this->privateKey, 'sha256');
        $params['sign'] = base64_encode($signature);
        
        return $params;
    }
    
    public function verifyRequest(array $params): bool {
        $signature = base64_decode($params['sign']);
        unset($params['sign']);
        ksort($params);
        $query = http_build_query($params);
        
        return openssl_verify($query, $signature, $this->publicKey, 'sha256') === 1;
    }
}

最佳實踐檢查清單

  • ✅ 使用 AES-GCM 或 ChaCha20-Poly1305 等 AEAD 模式
  • ✅ 金鑰使用 PBKDF2/Argon2 從密碼衍生,或安全隨機產生
  • ✅ IV/Nonce 絕不重複使用,隨機產生並隨密文儲存
  • ✅ RSA 使用 OAEP padding,避免 PKCS#1 v1.5 攻擊
  • ✅ 金鑰輪換機制、洩露應急預案
  • ✅ 敏感操作審計日誌、金鑰存取控制

OpenSSL 是 PHP 密碼學操作的基石,深入掌握其 API 與密碼學原理,能構建符合合規標準的安全系統。

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