Linux中不知道密码登录Mysql

Linux中不知道Mysql的root账户的登录密码该如何登录Mysql?
下面提供两种方式:一是使用skip-grant-tables跳过密码验证,二是修改存储在磁盘上的root账户的登录密码的Hash值。

测试环境:Ubuntu14.04 + Mysql5.5.57。

skip-grant-tables

顾名思义,“skip-grant-tables”是跳过授权表,不用密码便可以root身份登录,具有完全的root用户权限,可以修改root密码。

在网上找到一些文章,说停止Mysql服务后以“–skip-grant-tables”为参数启动Mysql便可以免密码登录,但在我的测试中,这种方式是无效的。有效的方法是在Mysql的配置文件中添加“skip-grant-tables”,再重启Mysql,之后便可以免密码登录。

在Linux中,Mysql的配置文件是my.cnf,它位于/etc/my.cnf或是/etc/mysql/my.cnf等,具体在哪,取决于Linux发行版本和Mysql安装方式。打开my.cnf,搜索“[mysqld]”,在这行下面添加一行,内容为:“skip-grant-tables”,如下图所示:

修改my.cnf文件

添加完成后重启Mysql服务,在我的测试环境中,用如下命令重启Mysql服务:

    sudo /etc/init.d/mysql restart

此时再登录Mysql,便不需要密码了,如下图所示:

无密码登录Mysql

修改root用户密码Hash值

Linux中,Mysql用户密码以Hash值的形式存储在文件user.MYD中,可用如下命令找到该文件位置:

  sudo find / -name user.MYD

查看该文件同样需要sudo权限,用cat命令查看该文件内容如下图所示:

可以看到该文件中有许多长得很像Hash值的东西。我们自己计算一个已知的字符串的Hash值,替换掉该文件中的Hash值,便可以达到修改root密码的目的。

这里有一个问题,Mysql在保存用户密码时使用了什么Hash算法?简单谷歌一下便知道,使用的算法如下:

  mysql> select concat('*',sha1(unhex(sha1('toor'))));
  +-------------------------------------------+
  | concat('*',sha1(unhex(sha1('toor'))))     |
  +-------------------------------------------+
  | *9cfbbc772f3f6c106020035386da5bbbf1249a11 |
  +-------------------------------------------+
  1 row in set (0.00 sec)

基本上是做了两次sha1,再在所得字符串前加上“*”,只不过在两次sha1中间还有一个unhex函数,
该函数的作用是将每对十六进制数字转化为一个字符,如unhex(‘616263’)的输出为“abc”。

此外,Mysql有内置函数password,可直接计算密码的Hash值:

    mysql> select password('toor');
    +-------------------------------------------+
    | password('toor')                          |
    +-------------------------------------------+
    | *9CFBBC772F3F6C106020035386DA5BBBF1249A11 |
    +-------------------------------------------+
    1 row in set (0.00 sec)

好了,现在用“9cfbbc…1”替换user.MYD文件中的“6B8252…B”,保存后尝试用密码“toor”登录Mysql的root用户,登录失败!
推测Mysql对该文件有所缓存,故重启Mysql,再次尝试用“toor”登录Mysql的root用户,这次成功登录。

参考文献

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

13 + 2 =