MySQL mysql.user 表的 Password 列存儲的是經過單向哈希處理的密碼值。當客戶端連接時,會將用戶輸入的明文密碼經過相同算法哈希,再與表中存儲的哈希值比對。因此:
CREATE USER 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
-- 或修改現有用戶
ALTER USER 'jeffrey'@'%' IDENTIFIED BY 'newpass';
自動處理哈希,無需手動調用函數。
-- 5.7.6+ / 8.0
SET PASSWORD FOR 'jeffrey'@'%' = 'biscuit';
-- 舊版本(需 PASSWORD())
SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');
GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
同時授權並設置密碼,自動哈希。
mysqladmin -u jeffrey -p password 'biscuit'
# 或指定用戶
mysqladmin -u root -p password 'newrootpass'
-- ❌ 錯誤:直接插入明文
INSERT INTO mysql.user (Host, User, Password) VALUES ('%', 'jeffrey', 'biscuit');
FLUSH PRIVILEGES;
-- 結果:用戶無法登入
shell> mysql -u jeffrey -pbiscuit
ERROR 1045 (28000): Access denied for user 'jeffrey'@'localhost'
UPDATE mysql.user
SET Password = PASSWORD('biscuit')
WHERE User = 'jeffrey' AND Host = '%';
FLUSH PRIVILEGES;
* 開頭),與 Unix crypt()、SHA、MD5 完全不同。PASSWORD() 函數已棄用,改用上述現代語法。MySQL 密碼管理的鐵律:永遠讓 MySQL 內部完成哈希計算。優先使用 CREATE USER/ALTER USER/SET PASSWORD/GRANT ... IDENTIFIED BY/mysqladmin password 等現代語法;僅在極舊版本(<5.7.6)手動操作 user 表時才需顯式調用 PASSWORD()。理解底層機制,避免「明文入庫」這類低級錯誤。