| 類型 | 特性 | MySQL 函數 | 適用場景 |
|---|---|---|---|
| 雙向加密 (可逆) | 加密後可解密還原明文 | ENCODE/DECODE, AES_ENCRYPT/AES_DECRYPT | 需顯示明文的敏感欄位 (身分證、銀行帳號、手機) |
| 單向加密 (不可逆) | 僅能驗證一致性,無法還原 | MD5, SHA1, SHA2, ENCRYPT, PASSWORD | 密碼、API Token、簽名驗證 |
-- 插入加密資料
INSERT INTO users (username, id_card)
VALUES ('alice', ENCODE('A123456789', 'master_key_2024'));
-- 查詢解密顯示
SELECT username, DECODE(id_card, 'master_key_2024') AS id_card
FROM users WHERE username='alice';
-- 結果: A123456789
缺點:加密強度低、金鑰硬編碼風險、8.0 已移除。
-- 設定金鑰 (32 位元組 = 256 bits)
SET @key = SHA2('master_key_2024', 256); -- 衍生固定長度金鑰
-- 插入 (HEX 格式儲存避免二進位字元集問題)
INSERT INTO users (username, id_card_enc)
VALUES ('alice', HEX(AES_ENCRYPT('A123456789', @key)));
-- 查詢解密
SELECT username,
AES_DECRYPT(UNHEX(id_card_enc), @key) AS id_card
FROM users WHERE username='alice';
優點:AES-256 標準、支援金鑰輪換、相容 OpenSSL。
-- 單純雜湊,無 Salt,極易遭 Rainbow Table 破解
INSERT INTO users (pwd_hash) VALUES (MD5('123456'));
-- 驗證
SELECT COUNT(*) FROM users WHERE pwd_hash = MD5('123456');
-- 內建 Salt (前 2 字元)
INSERT INTO users (pwd_hash) VALUES (ENCRYPT('123456', 'ab'));
-- 驗證需帶相同 Salt
SELECT COUNT(*) FROM users WHERE pwd_hash = ENCRYPT('123456', 'ab');
限制:僅限 *NIX 系統、長度限制、8.0 移除。
MySQL 內建不支援,必須在應用層處理:
// PHP 8.1+ 範例
$hash = password_hash('123456', PASSWORD_ARGON2ID); // 自動產生 Salt、Cost
// 驗證
if (password_verify('123456', $hash)) { /* 成功 */ }
// 儲存至 MySQL
$stmt = $pdo->prepare('INSERT INTO users (pwd_hash) VALUES (?)');
$stmt->execute([$hash]);
MySQL 欄位定義:pwd_hash VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin (支援長雜湊、區分大小寫)
┌─────────────┐ 加密/解密 ┌─────────────┐
│ 應用服務 │ ◄────────────────► │ 金鑰管理服務 │
│ (PHP/Java) │ 金鑰/加密演算法 │ (Vault/KMS) │
└──────┬──────┘ └─────────────┘
│ 密文
▼
┌─────────────┐
│ MySQL │ 僅存密文、索引非敏感欄位
│ (儲存層) │
└─────────────┘
| 措施 | 實作方式 | 效果 |
|---|---|---|
| SSL/TLS 傳輸加密 | REQUIRE SSL 建立使用者、mysql_ssl_rsa_setup、強制 require_secure_transport=ON | 防中間人竊聽 |
| 靜態資料加密 (TDE) | MySQL 8.0.16+ innodb_encrypt_tables=ON、金鑰環管理 | 防磁碟/備份檔案竊取 |
| 欄位遮罩/虛擬化 | Views 遮罩敏感欄位、DATA_MASKING 元件 (企業版) | 最小權限顯示 |
| 審計日誌 | audit_log 插件、記錄敏感表存取 | 事後追蹤合規 |
資料加密是纵深防禦的一環,結合應用層強雜湊、資料庫層 TDE/SSL、基礎設施層金鑰管理,才能構建完整的敏感資料保護體系。