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

MySQL 密碼設置本質:為什麼必須用 PASSWORD() 函數?

     編輯:MySQL 資料庫相關知識

核心機制:存儲的是哈希,而非明文

MySQL mysql.user 表的 Password 列存儲的是經過單向哈希處理的密碼值。當客戶端連接時,會將用戶輸入的明文密碼經過相同算法哈希,再與表中存儲的哈希值比對。因此:

  • 直接 INSERT 明文 → 存入明文 → 客戶端哈希後比對 → 永遠不匹配 → 拒絕連接。
  • 使用 PASSWORD() → 存入哈希 → 客戶端哈希後比對 → 匹配 → 允許連接。

正確設置密碼的四種方式

1. CREATE USER / ALTER USER(MySQL 5.7.6+ / 8.0 推薦)

CREATE USER 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
-- 或修改現有用戶
ALTER USER 'jeffrey'@'%' IDENTIFIED BY 'newpass';

自動處理哈希,無需手動調用函數。

2. SET PASSWORD 語句

-- 5.7.6+ / 8.0
SET PASSWORD FOR 'jeffrey'@'%' = 'biscuit';
-- 舊版本(需 PASSWORD())
SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');

3. GRANT ... IDENTIFIED BY

GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';

同時授權並設置密碼,自動哈希。

4. mysqladmin 命令行工具

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;

重要提醒

  • PASSWORD() ≠ 系統加密:MySQL 使用專有哈希算法(4.1 前為 16 位十六進制,4.1+ 為 41 位以 * 開頭),與 Unix crypt()、SHA、MD5 完全不同。
  • 8.0 默認採用 caching_sha2_password:更安全的認證插件,PASSWORD() 函數已棄用,改用上述現代語法。
  • 不可逆:哈希無法解密,忘記密碼只能重置,參見《如何修改遺失 MySQL ROOT 密碼》。

總結

MySQL 密碼管理的鐵律:永遠讓 MySQL 內部完成哈希計算。優先使用 CREATE USER/ALTER USER/SET PASSWORD/GRANT ... IDENTIFIED BY/mysqladmin password 等現代語法;僅在極舊版本(<5.7.6)手動操作 user 表時才需顯式調用 PASSWORD()。理解底層機制,避免「明文入庫」這類低級錯誤。

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