本系列第四篇,深入剖析 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) |
user 表匹配 Host、User、Password → 通過則建立連線,獲得全域權限。db → tables_priv → columns_priv,任一層級滿足即通過(權限疊加)。host 表作為 db 級的補充,用於「同一用戶從不同主機有不同庫權限」場景。Hash(plain) → cipher,無 Decrypt(cipher) → plain。Hash(input) == stored_hash,而非解密比對。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)。password_hash())、Argon2id(PHP 7.2+)、PBKDF2,透過成本因子人為增加計算時間。SELECT/INSERT/UPDATE/DELETE 於特定庫表,嚴禁 GRANT ALL、SUPER、FILE、SHUTDOWN。SELECT User, Host FROM mysql.user; 檢查匿名帳號、無密碼帳號、過寬權限。