首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 雙向加密實戰:ENCODE/DECODE 與 AES_ENCRYPT/AES_DECRYPT 保護敏感資料

     編輯:MySQL 資料庫相關知識

應用場景

Web 應用需儲存密碼、API Key、身分證號等敏感資料,資料庫被拖庫時仍能保證資料機密性。MySQL 內建兩組雙向加密函數:

  • ENCODE/DECODE:簡易、效能高、加密強度中等
  • AES_ENCRYPT/AES_DECRYPT:AES-128-ECB、強度高、效能稍低

一、ENCODE/DECODE 基礎用法

寫入加密資料

INSERT INTO users (username, password)
VALUES ('joe', ENCODE('guessme', 'abracadabra'));

結果為二進位字串,直接 SELECT 顯示亂碼。

讀取解密資料

SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe';
-- 回傳明文 'guessme'

應用層驗證範例

$query = "SELECT COUNT(*) FROM users
          WHERE username='$inputUser'
          AND DECODE(password, 'abracadabra') = '$inputPass'";

注意: 密鑰 'abracadabra' 洩露即意味著所有資料可被解密,生產環境請存放於環境變數或金鑰管理系統(KMS),勿硬編碼於程式碼。

二、AES_ENCRYPT/AES_DECRYPT 強化版

INSERT INTO users (username, password)
VALUES ('joe', AES_ENCRYPT('guessme', 'stronger_key_16_bytes!'));

SELECT AES_DECRYPT(password, 'stronger_key_16_bytes!') FROM users WHERE username='joe';
  • 金鑰長度建議 16/24/32 位元組(AES-128/192/256)
  • MySQL 內部使用 ECB 模式,若需 CBC/GCM 請在應用層處理
  • 回傳為二進位,建議 HEX() 儲存或 BLOB 欄位

三、安全最佳實踐

原則做法
密鑰管理環境變數 / Vault / AWS KMS / HashiCorp Vault,嚴禁入代碼庫
密碼儲存**不要雙向加密**,改用 **bcrypt / Argon2 / PBKDF2** 單向雜湊 + 鹽值
敏感非密碼欄位身分證、銀行卡、API Key 可用 AES_ENCRYPT
欄位型別加密後存 VARBINARY 或 BLOB,避免字符集轉換損壞資料
審計日誌記錄每次解密操作(誰、何時、哪筆),異常即告警
金鑰輪換定期重新加密存量資料,舊金鑰封存備查

四、效能對比(百萬筆測試參考)

函數加密耗時解密耗時CPU 佔用
ENCODE/DECODE~0.8 ms/萬筆~0.7 ms/萬筆低
AES_ENCRYPT/DECRYPT~2.5 ms/萬筆~2.3 ms/萬筆中

結語

MySQL 內建雙向加密函數提供「資料靜態加密」的基礎能力。**密碼類敏感資訊請務必使用單向強雜湊(bcrypt/Argon2)**,其他機密欄位可視風險等級選擇 ENCODE(低延遲、低強度)或 AES_ENCRYPT(高強度)。核心在於:**金鑰不落地、審計可追溯、輪換有機制**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved