在開發使用 MySQL 的 Web 應用時,資料庫中幾乎總會儲存密碼、個人身分資訊或商業機密等敏感數據。如何防止駭客入侵或內部人員竊取,同時不影響應用正常運作,是資安的關鍵課題。MySQL 內建多種加密函數,提供從基礎到高強度的資料保護方案,本文將系統介紹其用法與適用場景。
雙向加密使用金鑰加密,持有金鑰者可解密還原。MySQL 提供兩組函數:
語法簡單,適合一般性需求:
INSERT INTO users (username, password) VALUES ('joe', ENCODE('guessme', 'abracadabra'));
加密後儲存為二進位字串,查詢時顯示亂碼。驗證登入時使用 DECODE() 還原比對:
SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe';
PHP 整合範例:
$query = "SELECT COUNT(*) FROM users WHERE username='$inputUser' AND DECODE(password, 'abracadabra') = '$inputPass'";
當需要更強保護時,改用 AES 算法,用法相同但安全性大幅提升,符合現代合規要求。
單向加密(雜湊)將資料轉為固定長度指紋,無法反推原文。驗證時對輸入重新雜湊比對。
INSERT INTO users (username, password) VALUES ('joe', MD5('guessme'));
驗證:
SELECT COUNT(*) FROM users WHERE username='joe' AND password = MD5('guessme');
注意:MD5 已知有碰撞弱點,新專案建議改用 SHA-2 系列或 bcrypt/Argon2(需應用層實作)。
使用 Unix 底層 crypt(),需提供 salt(如 'ab'):
INSERT INTO users (username, password) VALUES ('joe', ENCRYPT('guessme', 'ab'));
驗證同樣帶入 salt:
SELECT COUNT(*) FROM users WHERE username='joe' AND password = ENCRYPT('guessme', 'ab');
限制:僅限 *NIX 系統,Windows 不支援。
MySQL 內建加密函數為資料安全提供了便利工具,但真正的防禦深度來自「應用層強雜湊 + 資料庫層加密 + 傳輸加密 + 完善權限控制」的多層體系。根據業務敏感度選擇合適方案,並定期審核金鑰輪換與演算法更新,才能持續守護核心資產。