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

MySQL 加密函數實戰:保護 Web 應用敏感數據

     編輯:MySQL 資料庫相關知識

前言

Web 應用常需儲存密碼、身分證號等敏感資料。MySQL 內建多種加密函數,可依安全需求選擇雙向加密(可解密)或單向加密(不可逆),構建多層防護。

一、雙向加密:需解密場景

適用於需還原原文的場景(如信用卡號、API 金鑰)。

1. ENCODE() / DECODE() — 基礎對稱加密

-- 儲存加密密碼
INSERT INTO users (username, password) 
VALUES ('joe', ENCODE('guessme', 'abracadabra'));

-- 驗證時解密比對
SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe';
-- 返回 'guessme'

特點: 密鑰即為解密鑰,結果為二進制字串。PHP 應用範例:

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

2. AES_ENCRYPT() / AES_DECRYPT() — 強度更高

INSERT INTO users (password) VALUES (AES_ENCRYPT('secret', 'strong_key'));
SELECT AES_DECRYPT(password, 'strong_key') FROM users;

採用 AES 演算法,金鑰長度可達 256-bit,符合合規要求。

二、單向加密:密碼儲存首選

不可逆轉,驗證時將輸入值同樣加密後比對密文。

1. MD5() — 經典雜湊

INSERT INTO users (password) VALUES (MD5('guessme'));
-- 儲存: 81a58e89df1f34c5487568e17327a219

SELECT COUNT(*) FROM users 
WHERE username='joe' AND password=MD5('guessme');

警示: MD5 已知碰撞漏洞,不建議用於新系統密碼儲存,僅供相容舊系統。

2. ENCRYPT() — 系統 crypt() 介面

INSERT INTO users (password) VALUES (ENCRYPT('guessme', 'ab'));
-- 儲存: ab/G8gtZdMwak (含 salt 前綴)

SELECT COUNT(*) FROM users 
WHERE username='joe' AND password=ENCRYPT('guessme', 'ab');
  • 僅限 *NIX 系統(依賴 libcrypt)
  • Salt 為 2+ 字元,自動嵌入密文首部
  • 較 MD5 安全,但仍不如現代慢速雜湊

三、現代最佳實踐建議

場景推薦方案MySQL 8.0+ 函數
使用者密碼bcrypt / Argon2 (應用層處理)無內建,勿用資料庫加密
敏感欄位加密AES-256-GCMAES_ENCRYPT() 配合 SHA2() 派生金鑰
資料完整性驗證HMAC-SHA256HMAC()
去識別化SHA-256 + SaltSHA2(str, 256)

四、關鍵安全原則

  1. 密碼永不加密,只雜湊: 使用 bcrypt/scrypt/Argon2 等慢速雜湊,在應用層完成
  2. 金鑰管理分離: 加密金鑰勿硬編碼,使用 Vault/KMS 管理
  3. 最小權限: 資料庫布號僅具備必要加解密函數執行權限
  4. 審計日誌: 記錄所有敏感欄位存取操作

結論: MySQL 加密函數可作為輔助防線,但核心密碼保護應在應用層以現代慢速雜湊實現。資料庫層面重點保護 PII(個人識別資訊)等非密碼敏感欄位。

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