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
2
3
通过man 5 passwd,man 5 shadow可查看文件中各字段含义。
如果你只有root用户,而忘记了密码,那没办法,即使暴力破解或者字典破解,由于你不知道加密算法中使用的salt,是破解不了的。
但是如果你的某个用户拥有sudoer权限的话,即使忘了root密码,也还是可以修改的。可能你并不了解这里面的加密算法以及salt是什么,别急,接下来我把背景知识补充一下。
# 什么是加密函数
密码的散列存储 如果你用过ss科学上网,你可能听说过一下这些中的某一个:
- none
- rc4
- rc4-md5
- rc4-md5-6
- aes-128-ctr
- aes-192-ctr
- aes-256-ctr
- aes-128-cfb
- aes-192-cfb
- aes-256-cfb
- aes-128-cfb8
- aes-192-cfb8
- aes-256-cfb8
- salsa20
- chacha20
- chacha20-ietf
AES,SHA1,DES,RSA,MD5区别 - CSDN博客 (opens new window) 这里有一篇文章专门讲这些加密方式的区别
总而言之,如果你的密码以明文的方式直接存储在数据库中是很危险的。于是我们想了一种办法,对密码进行SHA512加密,所谓加密,你可以理解为一个函数,确切的说是一个不可逆的散列函数(哈希函数),当你把密码当做这个函数的输入,会输出一串加密过的密码,如果你的机器被黑客黑了,他最多只能得到你加密过的密码。同样,每次你输入密码,系统会把密码输入哈希函数,拿输出的值与数据库中的值比较,如果你们有相同的输出,则你们是同一个人,如果函数的输出不同,你们就不是一个人。
比如:
mkpasswd -m sha-512
Password: apple
$6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ.
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:::
2
3
4
5
# 添加用户到sudo 用户组
usermod -aG sudo username
# 删除用户
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
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就行。