Web 應用常需儲存密碼、身分證號等敏感資料。MySQL 內建多種加密函數,可依安全需求選擇雙向加密(可解密)或單向加密(不可逆),構建多層防護。
適用於需還原原文的場景(如信用卡號、API 金鑰)。
-- 儲存加密密碼
INSERT INTO users (username, password)
VALUES ('joe', ENCODE('guessme', 'abracadabra'));
-- 驗證時解密比對
SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe';
-- 返回 'guessme'
特點: 密鑰即為解密鑰,結果為二進制字串。PHP 應用範例:
$query = "SELECT COUNT(*) FROM users WHERE username='$inputUser' AND DECODE(password, 'abracadabra') = '$inputPass'";
INSERT INTO users (password) VALUES (AES_ENCRYPT('secret', 'strong_key'));
SELECT AES_DECRYPT(password, 'strong_key') FROM users;
採用 AES 演算法,金鑰長度可達 256-bit,符合合規要求。
不可逆轉,驗證時將輸入值同樣加密後比對密文。
INSERT INTO users (password) VALUES (MD5('guessme'));
-- 儲存: 81a58e89df1f34c5487568e17327a219
SELECT COUNT(*) FROM users
WHERE username='joe' AND password=MD5('guessme');
警示: MD5 已知碰撞漏洞,不建議用於新系統密碼儲存,僅供相容舊系統。
INSERT INTO users (password) VALUES (ENCRYPT('guessme', 'ab'));
-- 儲存: ab/G8gtZdMwak (含 salt 前綴)
SELECT COUNT(*) FROM users
WHERE username='joe' AND password=ENCRYPT('guessme', 'ab');
| 場景 | 推薦方案 | MySQL 8.0+ 函數 |
|---|---|---|
| 使用者密碼 | bcrypt / Argon2 (應用層處理) | 無內建,勿用資料庫加密 |
| 敏感欄位加密 | AES-256-GCM | AES_ENCRYPT() 配合 SHA2() 派生金鑰 |
| 資料完整性驗證 | HMAC-SHA256 | HMAC() |
| 去識別化 | SHA-256 + Salt | SHA2(str, 256) |
結論: MySQL 加密函數可作為輔助防線,但核心密碼保護應在應用層以現代慢速雜湊實現。資料庫層面重點保護 PII(個人識別資訊)等非密碼敏感欄位。