Web 應用存儲密碼、身份證、銀行卡等敏感信息時,數據庫層面加密是纵深防御關鍵一環。MySQL 內置多種加密函數,本文對比雙向加密、單向哈希特性與適用場景。
INSERT INTO users (username, password) VALUES ('joe', ENCODE('guessme', 'abracadabra'));
SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe'; -- 返回 'guessme'
-- AES-128-ECB 模式(MySQL 默認)
INSERT INTO users (username, ssn) VALUES ('joe', AES_ENCRYPT('123-45-6789', 'master_key_16B'));
SELECT AES_DECRYPT(ssn, 'master_key_16B') FROM users WHERE username='joe';
AES_ENCRYPT(str, key, 'aes-256-cbc', iv) 指定 CBC 模式INSERT INTO users (username, password_hash) VALUES ('joe', MD5('guessme'));
SELECT COUNT(*) FROM users WHERE username='joe' AND password_hash = MD5('guessme');
-- 應用層生成鹽值
$salt = random_bytes(16);
$hash = hash('sha256', $password . $salt);
-- 存儲 $hash 和 $salt
MySQL 5.5+ 支持 SHA2(str, 256|512),但鹽值管理仍需應用層處理。
INSERT INTO users (username, password_hash) VALUES ('joe', ENCRYPT('guessme', 'ab'));
SELECT COUNT(*) FROM users WHERE username='joe' AND password_hash = ENCRYPT('guessme', 'ab');
crypt(),Windows 不支持| 數據類型 | 推薦方案 | 關鍵點 |
|---|---|---|
| 用戶密碼 | bcrypt / Argon2 / PBKDF2 | 自帶鹽、可調成本因子、應用層計算 |
| 身份證/銀行卡 | AES-256-GCM / ChaCha20-Poly1305 | 認證加密、應用層管理 DEK/KEK |
| 手機/郵箱 | 格式保留加密 (FPE) / 令牌化 | 保持格式便於索引/查詢 |
| 日志/審計 | 字段級加密 + 密鑰輪換 | 合規審計、密鑰生命週期管理 |
-- 動態遮罩(需權限)
SELECT masking_inner(ssn, 3, 2, 'X') FROM users; -- 123-XX-XXXXX
-- 去標識化函數
SELECT gen_blacklist('credit_card', cc_number) FROM payments;
數據庫加密函數是戰術工具,戰略核心在應用層密碼學設計與密鑰管理體系。選對工具,管好鑰,才是真安全。