首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 加密函數實戰:雙向加密 ENCODE/DECODE、AES、單向加密 MD5/SHA/ENCRYPT 選型指南

     編輯:MySQL 綜合教學

Web 敏感數據加密:MySQL 內建函數選型與最佳實踐

密碼、Token、PII 數據落庫前必須加密。MySQL 提供雙向 (可逆) 與單向 (不可逆) 兩大族函數,按業務場景選型。

一、雙向加密:需解密還原原文

函數組算法強度適用場景備註
ENCODE()/DECODE()自定義 XOR 類弱低敏感度配置、臨時混淆5.7+ 棄用,8.0 移除
AES_ENCRYPT()/AES_DECRYPT()AES-128-ECB中配置加密、ID 遮罩、可逆業務Key 長度 16/24/32 字節
DES_ENCRYPT()/DES_DECRYPT()DES極弱不建議使用已移除

AES 實戰範例


-- 存儲
INSERT INTO users (uid, pwd_enc) VALUES (1, AES_ENCRYPT('my_password', 'secret_key_16bytes'));

-- 驗證 (應用層解密比對,或 SQL 直接比對)
SELECT COUNT(*) FROM users WHERE uid=1 AND AES_DECRYPT(pwd_enc, 'secret_key_16bytes') = 'my_password';

-- 查看密文 (二進制,通常用 HEX/BASE64 存儲)
SELECT HEX(AES_ENCRYPT('test', 'key1234567890123'));  -- 存儲為字串

二、單向加密:只驗證、不還原 (密碼存儲首選)

函數算法輸出長度強度適用場景
MD5()MD532 hex極弱 (碰撞、彩虹表)非安全校驗、緩存Key
SHA1()SHA-140 hex弱Git 兼容、非安全
SHA2(str, 256)SHA-25664 hex強應用層鹽值 + SHA256 可接受
SHA2(str, 512)SHA-512128 hex極強高安全需求
PASSWORD()MySQL 專用41 char內部認證不可用於業務
ENCRYPT()Unix crypt()var中僅 *NIX、需 Salt、8.0 移除

密碼存儲黃金標準:應用層 bcrypt/Argon2


// PHP 7.2+
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// 驗證
password_verify($input, $hash);

切勿在資料庫層做密碼哈希:SQL 日誌、慢查詢、備份、複製會暴露明文/哈希。應用層加密後再寫入 DB。

三、密鑰管理鐵律

  1. 密鑰不寫在代碼/配置文件/資料庫,使用密鑰管理系統 (HashiCorp Vault、AWS KMS、Azure Key Vault) 或環境變量注入。
  2. 密鑰輪換機制:定期換鑰、舊鑰解密舊數據、新鑰加密新數據、版本標識區分。
  3. 最小權限:資料庫賬號無 SELECT 加密列權限 (通過視圖/存儲過程代理)。

四、合規性提示

  • GDPR、個資法要求個人數據加密存儲、傳輸加密、密鑰分離管理。
  • 審計日誌記錄加密/解密操作 (誰、何時、哪張表、哪些列)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved