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

MySQL 資料庫安全解決方案(四):五大授權表詳解與雜湊加密原理

     編輯:MySQL 資料庫相關知識

本系列第四篇,深入剖析 MySQL 權限系統的核心——五大授權表,並系統闡述單向雜湊加密在敏感資料(密碼、銀行卡)保護中的原理與應用。

MySQL 五大授權表架構

表名層級核心功能修改方式
user全域/伺服器用戶帳號、加密密碼、全域權限(SUPER、SHUTDOWN 等)GRANT/REVOKE、CREATE USER、SET PASSWORD
host主機針對特定主機的權限補充,**不考慮用戶****僅能手工修改**(GRANT/REVOKE 不影響)
db資料庫資料庫級權限(SELECT、INSERT、DROP 等)GRANT/REVOKE ON db.*
tables_priv資料表表級權限GRANT/REVOKE ON db.tbl
columns_priv欄位欄位級權限(極少用)GRANT/REVOKE ON db.tbl(col)

權限檢查順序(由粗到細)

  1. 連線階段:user 表匹配 Host、User、Password → 通過則建立連線,獲得全域權限。
  2. 請求階段:依序檢查 db → tables_priv → columns_priv,任一層級滿足即通過(權限疊加)。
  3. host 表作為 db 級的補充,用於「同一用戶從不同主機有不同庫權限」場景。

雜湊加密(單向加密)核心原理

  • 不可逆:Hash(plain) → cipher,無 Decrypt(cipher) → plain。
  • 驗證而非解密:登入時 Hash(input) == stored_hash,而非解密比對。
  • 應用場景:密碼、銀行卡 PIN、API Token、任何「只需驗證、無需還原」的敏感欄位。

MySQL 提供的四大雜湊函數

SELECT MD5('pa55Word');      -- a17a41337551d6542fd005e18b43afd4 (32 hex)
SELECT SHA1('pa55Word');     -- 40 hex
SELECT PASSWORD('pa55Word'); -- 內部認證專用,版本相關
SELECT ENCRYPT('pa55Word');  -- 系統 crypt(),含鹽,Windows 不支援

實戰:密碼雜湊儲存與驗證模式

-- 建表
CREATE TABLE accounts (
    uid INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE,
    pwd_hash CHAR(32) BINARY NOT NULL  -- MD5 固定 32 字元
);

-- 註冊
INSERT INTO accounts (username, pwd_hash) VALUES ('bob', MD5('strongPass!'));

-- 登入驗證(參數化防注入)
SELECT uid FROM accounts WHERE username = ? AND pwd_hash = MD5(?);

進階防護:加鹽與慢速雜湊(應用層實作)

資料庫層 MD5() 無鹽、極快,**不足以抵禦彩虹表與 GPU 破解**。生產環境**必須在應用層**實施:

  • 隨機鹽值:每用戶唯一鹽,存 salt 欄位,驗證時 Hash(salt + password)。
  • 慢速雜湊演算法:bcrypt(password_hash())、Argon2id(PHP 7.2+)、PBKDF2,透過成本因子人為增加計算時間。
  • 資料庫僅存最終雜湊字串(含演算法標識、鹽、成本、雜湊值),不存明文、不存單純 MD5。

授權表操作黃金法則

  1. 優先用 GRANT/REVOKE,避免直接 DML 操作授權表導致權限不一致。
  2. FLUSH PRIVILEGES:手工修改授權表後必須執行,或重啟服務。
  3. 最小權限原則:應用帳號僅授 SELECT/INSERT/UPDATE/DELETE 於特定庫表,嚴禁 GRANT ALL、SUPER、FILE、SHUTDOWN。
  4. 定期審計:SELECT User, Host FROM mysql.user; 檢查匿名帳號、無密碼帳號、過寬權限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved