本文演示一種「偽加密」算法:密鑰派生 + 字節級異或變體。非標準加密,不可用於生產敏感數據,僅供教學理解對稱加密基本結構。
安全性深度分析 ⚠️
| 維度 | 評估 | 風險 |
|---|---|---|
| 密鑰空間 | MD5 輸出 128bit,但實際密鑰流僅 32 字節循環 | 🔴 極低,已知明文攻擊輕鬆破解 |
| 算法類型 | 流密碼變體(加法模 256) | 🔴 無擴散性,單字節修改只影響對應密文字節 |
| 完整性 | 無 MAC/認證標籤 | 🔴 密文可被任意篡改,解密後無法檢測 |
| 重放攻擊 | 無 Nonce/IV | 🔴 相同明文+密鑰 → 相同密文,語義洩露 |
| 側信道 | PHP 字符串操作計時可被分析 | 🟡 中等 |
| 標準合規 | 非任何標準算法 | 🔴 不可審計、不可合規 |
function aesEncrypt(string $data, string $key): string {
$key = hash('sha256', $key, true); // 32 字節密鑰
$iv = random_bytes(12); // 96-bit GCM 標準 IV
$tag = '';
$encrypted = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, '', 12);
return base64_encode($iv . $tag . $encrypted);
}
function aesDecrypt(string $payload, string $key): string {
$key = hash('sha256', $key, true);
$raw = base64_decode($payload);
$iv = substr($raw, 0, 12);
$tag = substr($raw, 12, 16);
$encrypted = substr($raw, 28);
return openssl_decrypt($encrypted, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, '', 12);
}
function sodiumEncrypt(string $data, string $key): string {
$key = sodium_crypto_secretbox_keygen(); // 或從密碼派生
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = sodium_crypto_secretbox($data, $nonce, $key);
return base64_encode($nonce . $cipher);
}
function sodiumDecrypt(string $payload, string $key): string {
$raw = base64_decode($payload);
$nonce = substr($raw, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = substr($raw, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
return sodium_crypto_secretbox_open($cipher, $nonce, $key);
}
$hash = password_hash($password, PASSWORD_ARGON2ID); // 存儲 $valid = password_verify($password, $hash); // 驗證
文中 MD5 加密算法僅供教學演示對稱加密結構,**嚴禁用於真實業務**。生產環境請直接使用 OpenSSL AES-GCM 或 Sodium,配合 Argon2id 密碼派生、隨機 IV/Nonce、認證加密,才能構建安全的數據保護體系。