當 Web 應用程式使用 MySQL 儲存密碼或其他敏感資訊時,如何防止駭客竊取或內部人員窺探,始終是資安防禦的核心課題。MySQL 內建多種加密函數,提供不同強度的保護機制,讓開發者能依據業務需求選擇適當方案。本文將深入解析雙向加密的 ENCODE/DECODE 與更高強度的 AES_ENCRYPT/AES_DECRYPT,並示範實務應用場景。
雙向加密的核心概念是:資料經由一組金鑰加密,僅持有相同金鑰者才能解密還原。MySQL 提供 ENCODE() 與 DECODE() 兩個函數支援此機制。以下範例示範如何為使用者 joe 儲存加密後的密碼 guessme,金鑰設為 abracadabra:
mysql> INSERT INTO users (username, password)
VALUES ('joe', ENCODE('guessme', 'abracadabra'));
Query OK, 1 row affected (0.14 sec)
加密結果會以二進位字串形式儲存,直接查詢會顯示不可讀字元:
mysql> SELECT * FROM users WHERE username='joe';
+----------+----------+
| username | password |
+----------+----------+
| joe | ¡?i??!? |
+----------+----------+
解密時必須提供相同金鑰:
mysql> SELECT DECODE(password, 'abracadabra')
FROM users WHERE username='joe';
+---------------------------------+
| DECODE(password, 'abracadabra') |
+---------------------------------+
| guessme |
+---------------------------------+
在驗證使用者登入時,後端程式可直接在 SQL 查詢中解密比對:
<?php
$query = "SELECT COUNT(*) FROM users
WHERE username='$inputUser'
AND DECODE(password, 'abracadabra') = '$inputPass'";
?>
AES_ENCRYPT() 與 AES_DECRYPT(),運作邏輯相同但採用 AES 演算法,抗暴力破解能力大幅提升。善用 MySQL 內建加密函數,能在不引入外部依賴的前提下,大幅降低敏感資料外洩風險,是資料庫層級防護的第一道防線。