資料安全是現代應用核心需求。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);
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 = 錯誤
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;
}
}
OpenSSL 是 PHP 密碼學操作的基石,深入掌握其 API 與密碼學原理,能構建符合合規標準的安全系統。