Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  End-User Guidelines for Password Security

8.1.2.1 用户密码安全指南

MySQL 用户应该遵循以下指南来保持密码安全。

当您运行客户端程序连接到 MySQL 服务器时,不建议在明文中指定密码,以免被其他用户发现。下面列出了可以指定密码的方法,以及每种方法的风险。简言之,最安全的方法是让客户端程序提示输入密码或在正确保护的选项文件中指定密码。

  • 使用 mysql_config_editor 实用程序,该实用程序允许您在加密的登录路径文件 .mylogin.cnf 中存储身份验证凭据。该文件可以被 MySQL 客户端程序读取,以获取连接到 MySQL 服务器的身份验证凭据。见 第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”

  • 使用命令行选项 --password=password-ppassword。例如:

    $> mysql -u francis -pfrank db_name
    Warning

    这很方便 但不安全。在某些系统上,您的密码可能会被系统状态程序如 ps 所见,该程序可能被其他用户调用以显示命令行。MySQL 客户端通常会在初始化序列中覆盖命令行密码参数。但是,在某些系统上,这种覆盖策略无效,密码仍然对 ps 可见。(SystemV Unix 系统和其他系统可能存在这个问题。)

    如果您的操作环境设置为在终端窗口的标题栏中显示当前命令,那么密码将保持可见,直到命令运行完毕,即使命令已经从窗口内容区域滚动出去。

  • 使用命令行选项 --password-p,但不指定密码值。在这种情况下,客户端程序将交互式地请求密码:

    $> mysql -u francis -p db_name
    Enter password: ********

    星号字符 * 表示您输入密码的地方。密码不会在您输入时显示。

    以这种方式输入密码比在命令行上指定密码更安全,因为密码不会被其他用户看到。但是,这种方法仅适用于交互式程序。如果您想从非交互式脚本中调用客户端,那么就没有机会从键盘输入密码。在某些系统上,您甚至可能发现脚本的第一行被读取和解释(错误地)为您的密码。

  • 将密码存储在选项文件中。例如,在 Unix 上,您可以在家目录中的 .my.cnf 文件的 [client] 部分中列出密码:

    [client]
    password=password

    为了保持密码安全,该文件不应该对其他用户开放。为确保这一点,请将文件访问模式设置为 400600。例如:

    $> chmod 600 .my.cnf

    要从命令行指定包含密码的特定选项文件,请使用 --defaults-file=file_name 选项,其中 file_name 是文件的完整路径名。例如:

    $> mysql --defaults-file=/home/francis/mysql-opts

    第 6.2.2.2 节,“使用选项文件” 详细讨论了选项文件。

在 Unix 上,mysql 客户端将执行的语句记录写入历史文件(见 第 6.5.1.3 节,“mysql 客户端日志记录”)。默认情况下,该文件名为 .mysql_history,位于家目录中。密码可能以明文形式出现在 SQL 语句中,如 CREATE USERALTER USER 中,因此如果您使用这些语句,它们将被记录在历史文件中。为了保持该文件安全,请使用限制性访问模式,同样如前面对 .my.cnf 文件所描述的那样。

如果您的命令解释器维护历史记录,任何保存命令的文件都将包含在命令行上输入的 MySQL 密码。例如,bash 使用 ~/.bash_history。任何这样的文件都应该具有限制性的访问模式。