#### 6.1.2.1 最终用户密码安全指南

[](<>)

MySQL 用户应使用以下准则来确保密码安全。

当您运行客户端程序以连接到 MySQL 服务器时，不建议以将密码暴露给其他用户发现的方式指定您的密码。此处列出了在运行客户端程序时可用于指定密码的方法，以及每种方法的风险评估。简而言之，最安全的方法是让客户端程序提示输入密码或在适当保护的选项文件中指定密码。

-   使用[**mysql\_配置\_编辑**](mysql-config-editor.html)实用程序，它使您能够将身份验证凭据存储在名为的加密登录路径文件中`.mylogin.cnf`.MySQL 客户端程序稍后可以读取该文件，以获取连接到 MySQL 服务器的身份验证凭据。看[第 4.6.7 节，“mysql\_配置\_编辑器 — MySQL 配置实用程序”](mysql-config-editor.html).

-   [](<>) [](<>)用一个`--密码=*`密码`*`要么`-p*`密码`*`命令行选项。例如：

    ```
    $> mysql -u francis -pfrank db_name
    ```

    警告

    这个很方便*但不安全*.在某些系统上，您的密码对系统状态程序可见，例如**ps**其他用户可以调用它来显示命令行。MySQL 客户端通常在初始化序列期间用零覆盖命令行密码参数。但是，仍然有一个短暂的时间间隔，在此期间该值是可见的。此外，在某些系统上，这种覆盖策略是无效的，密码仍然可见**ps**.（SystemV Unix 系统和其他系统可能会遇到这个问题。）

    如果您的操作环境设置为在终端窗口的标题栏中显示您当前的命令，则只要命令正在运行，密码就会保持可见，即使该命令已滚动到窗口内容区域的视图之外。

-   使用[`- 密码`](connection-options.html#option_general_password)要么`-p`没有指定密码值的命令行选项。在这种情况下，客户端程序以交互方式请求密码：

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

    这`*`字符表示您输入密码的位置。输入密码时不会显示密码。

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

-   将密码存储在选项文件中。例如，在 Unix 上，您可以在`[客户]`的部分`.my.cnf`主目录中的文件：

    [](<>)[](<>)

    ```
    [client]
    password=password
    ```

    为了保证密码安全，除了您自己之外，任何人都不能访问该文件。为确保这一点，请将文件访问模式设置为`400`要么`600`.例如：

    ```
    $> chmod 600 .my.cnf
    ```

    要从命令行命名包含密码的特定选项文件，请使用[`--默认文件=*`文件名`*`](option-file-options.html#option_general_defaults-file)选项，在哪里`文件名`是文件的完整路径名。例如：

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

    [第 4.2.2.2 节，“使用选项文件”](option-files.html)，更详细地讨论了选项文件。

[](<>)

在 Unix 上，[**mysql**](mysql.html)客户端将执行语句的记录写入历史文件（参见[第 4.5.1.3 节，“mysql 客户端日志记录”](mysql-logging.html)）。默认情况下，此文件名为`.mysql_history`并在您的主目录中创建。密码可以写成 SQL 语句中的纯文本，例如[`创建用户`](create-user.html)和[`更改用户`](alter-user.html)，因此如果您使用这些语句，它们将记录在历史文件中。为保证此文件的安全，请使用限制性访问模式，方法与前面描述的相同`.my.cnf`文件。

如果您的命令解释器维护历史记录，则保存命令的任何文件都包含在命令行中输入的 MySQL 密码。例如，**重击**用途`~/.bash_history`.任何此类文件都应具有限制性访问模式。
