MySQL 是一種流行的關系型數據庫管理系統,它使用用戶名和密碼來限制用戶對數據庫的訪問。MySQL 提供了一種簡單而有效的方法來保護密碼,即通過密碼文件和密文存儲方式來保存密碼。
$ mysql_config_editor set --login-path=local --host=localhost --user=username --password Enter password: $ cat ~/.mylogin.cnf [local] user=username password=mysupersecretpassword
MySQL 密碼文件就是 .mylogin.cnf,它可以存儲多組用戶名和密碼。這個文件只有用戶自己可以讀取和寫入,確保了密碼文件的安全性。另外,MySQL 利用基于加密算法的密文來存儲密碼,這樣即使有人獲得了密碼文件,也不會輕易地獲取到密碼。
$ SELECT user, password FROM mysql.user WHERE User = 'username'; +----------+-------------------------------------------+ | user | password | +----------+-------------------------------------------+ | username | *A1296498F7F008C4F3A2E552720EA9CDB1ED8D3D | +----------+-------------------------------------------+
在命令行下的查詢中,用戶的密碼字段以 \* 開頭的密文形式存儲。因為可能有多種加密算法可供選擇,如果想知道哪種算法用來加密密碼,可以執行如下的查詢。
$ SHOW VARIABLES LIKE 'default_password%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | default_password_lifetime | 0 | | default_password_return | 0 | | default_password_algorithm | sha256_password | +------------------------+-------+
接下來是一個簡單的例子,展示如何用 Python 驗證一個用戶的密碼。Python 3.x 版本中的 MySQL Connector API 包含一個名為 auth_plugin 的庫,可以幫助我們驗證密碼。
import mysql.connector as mysql config = { "user": "root", "password": "mypassword", "host": "localhost", "database": "mydatabase" } cnx = mysql.connect(**config) try: # create a user named `myuser` with password `mypassword` cursor = cnx.cursor() cursor.execute("CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';") cursor.execute("GRANT ALL ON mydatabase.* TO 'myuser'@'localhost';") cursor.close() # authenticate the user with their password auth_plugin = cnx.auth_plugin_name if auth_plugin == "caching_sha2_password": import sha2_password_auth auth_string = sha2_password_auth.auth_string(config["password"]) else: from mysql_native_password import get_auth_plugin auth_string = get_auth_plugin(config["password"]) cnx = mysql.connect(user="myuser", password=auth_string, **config) print("Authenticated successfully") finally: cnx.close()