linux 忘记root密码怎么办

1/16/2022 linux
linux账户保存在/etc/passwd,密码保存在/etc/shadow文件中。前者无需超级用户权限即可阅读。
ll /etc/passwd /etc/shadow
-rw-r--r-- 1 root root   2055 Sep 26 12:30 /etc/passwd
-rw-r----- 1 root shadow 1112 Nov 24 22:54 /etc/shadow
1
2
3
通过man 5 passwd,man 5 shadow可查看文件中各字段含义。

如果你只有root用户,而忘记了密码,那没办法,即使暴力破解或者字典破解,由于你不知道加密算法中使用的salt,是破解不了的。

但是如果你的某个用户拥有sudoer权限的话,即使忘了root密码,也还是可以修改的。可能你并不了解这里面的加密算法以及salt是什么,别急,接下来我把背景知识补充一下。

# 什么是加密函数

密码的散列存储 如果你用过ss科学上网,你可能听说过一下这些中的某一个:

  1. none
  2. rc4
  3. rc4-md5
  4. rc4-md5-6
  5. aes-128-ctr
  6. aes-192-ctr
  7. aes-256-ctr
  8. aes-128-cfb
  9. aes-192-cfb
  10. aes-256-cfb
  11. aes-128-cfb8
  12. aes-192-cfb8
  13. aes-256-cfb8
  14. salsa20
  15. chacha20
  16. chacha20-ietf

AES,SHA1,DES,RSA,MD5区别 - CSDN博客 (opens new window) 这里有一篇文章专门讲这些加密方式的区别

总而言之,如果你的密码以明文的方式直接存储在数据库中是很危险的。于是我们想了一种办法,对密码进行SHA512加密,所谓加密,你可以理解为一个函数,确切的说是一个不可逆的散列函数(哈希函数),当你把密码当做这个函数的输入,会输出一串加密过的密码,如果你的机器被黑客黑了,他最多只能得到你加密过的密码。同样,每次你输入密码,系统会把密码输入哈希函数,拿输出的值与数据库中的值比较,如果你们有相同的输出,则你们是同一个人,如果函数的输出不同,你们就不是一个人。

比如:

mkpasswd -m sha-512
Password: apple
$6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ.
1
2
3
在ubuntu系统中使用sudo apt-get install whois可以获得这个mkpasswd命令,通过这个命令我们可以对密码进行加密。

我们看到,如果你的密码是apple,密码的散列值貌似是这么一长串。实际上,这一长串密码被"$"分割,第一个阿拉伯数字,代表了加密方法的种类, 这里6就代表了sha-512这种加密方式。第二个我们一会再说。第三个即为apple的散列值。系统中不存储apple这个密码,存储的是下面的散列值。当你再次输入密码的时候,会再次生成散列值,用于和数据库中的进行比较。

# 什么是salt?

举个例子,比如,如果你的密码仅仅是一个单词,黑客有一本字典,这个字典的每个单词后面都对应了这个单词的散列值。然后黑客看着你经过加密的密码,一页一页翻看字典。没翻几页他就发现,单词apple的散列值咋和你加密过的密码一样?

加Salt可以一定程度上解决这一问题。所谓加Salt,就是加点“佐料”。其基本想法是这样的——当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。

我们刚才看到的$6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ. 这一串密文中, LyVpT/aetS即为加入的“盐”

# 如何修改密码?

# 添加用户

sudo adduser username

sudo cat /etc/shadow

tom:$6$iXDRKGEq$3FdFbXuwnPk7lSozGCsIws3q/o3HhYYpdiKqt6cQ3yGMIQxMLO93KXRAgD5uJJaCQhvZOiuEwkh6ti8I3AYL50:17599:0:99999:7:::
1
2
3
4
5

# 添加用户到sudo 用户组

usermod -aG sudo username
1

# 删除用户

sudo userdel username

参数:
  -r  remove home directory and mail spool
  -f  force removal of files, even if not owned by user
  -z  remove any SELinux user mapping for the user
1
2
3
4
5
6

我在linux中添加了一个用户tom来作为演示。 这天tom忘记了自己的密码,很着急,想知道如何找回密码。我说,密码是找不回了,但是我可以帮你修改原来的密码。

于是乎,我把上面apple的散列值替换了tom的散列值

tom:$6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ.:17599:0:99999:7:::

tom你好, apple就是你现在的新密码了。

如果你没有超级用户权限,也忘了密码的话,可以启用单用户模式

Red Hat Linux 进入单用户模式 修改root密码 (opens new window)

如果你有sudo权限,sudo passwd root就行。

Last Updated: 12/26/2022, 11:54:10 AM