Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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=密码-p密码选项。例如:

    $> 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。所有这样的文件应该具有受限的访问模式。