MySQL mysql.user 表中 Password (5.7+ 為 authentication_string) 欄位儲存加密雜湊值,非明文。直接寫入明文會導致驗證失敗。
USE mysql;
INSERT INTO user (Host, User, Password)
VALUES ('%', 'newuser', PASSWORD('mypassword'));
FLUSH PRIVILEGES;
-- 為現有使用者設定/變更密碼
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
-- 或 MySQL 5.7.6+
SET PASSWORD FOR 'username'@'host' = 'newpassword'; -- 伺服器端自動雜湊
FLUSH PRIVILEGES;
-- 一次完成:建立使用者 + 授權 + 設定密碼
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'mypassword';
-- IDENTIFIED BY 子句自動處理 PASSWORD() 加密
FLUSH PRIVILEGES;
# 為 root 設定密碼 (首次無舊密碼)
mysqladmin -u root password 'newpassword'
# 變更現有密碼
mysqladmin -u root -p'oldpassword' password 'newpassword'
# 重載權限 (等同 FLUSH PRIVILEGES)
mysqladmin -u root -p'password' reload
# 或
mysqladmin -u root -p'password' flush-privileges
mysql.user、db、tables_priv 等授權表變更從磁碟重載至記憶體快取GRANT/REVOKE 隱含執行,INSERT/UPDATE/DELETE 直接操作權限表時必須手動執行mysql.user 讀取儲存雜湊值Access denied| 錯誤做法 | 後果 | 正確做法 |
|---|---|---|
INSERT ... VALUES ('%', 'u', 'plainpass') | 儲存明文,驗證永遠失敗 | 使用 PASSWORD('plainpass') 或 IDENTIFIED BY |
修改權限表未 FLUSH PRIVILEGES | 變更不生效 | 務必執行 FLUSH PRIVILEGES 或 mysqladmin reload |
MySQL 5.7+ 使用 Password 欄位 | 欄位不存在/錯誤 | 使用 authentication_string 欄位 |
SET PASSWORD = 'plain' (無 PASSWORD()) | 舊版儲存明文 | 5.7.6+ 伺服器端自動雜湊,舊版需 PASSWORD() |
validate_password 外掛強制複雜度ALTER USER 'user'@'host' PASSWORD EXPIRE INTERVAL 90 DAY;PASSWORD HISTORY 5RENAME USER 'root'@'%' TO 'root'@'localhost';DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;