Linux中shadow文件详解

加密密码的文件,听上去似乎可以做点什么,然而实际上啥都做不了,一个鸡肋啊。

文件样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
myths@myths-X450LD:/home$ sudo cat /etc/shadow
root:!:16618:0:99999:7:::
daemon:*:16484:0:99999:7:::
bin:*:16484:0:99999:7:::
sys:*:16484:0:99999:7:::
sync:*:16484:0:99999:7:::
games:*:16484:0:99999:7:::
man:*:16484:0:99999:7:::
lp:*:16484:0:99999:7:::
mail:*:16484:0:99999:7:::
news:*:16484:0:99999:7:::
uucp:*:16484:0:99999:7:::
proxy:*:16484:0:99999:7:::
www-data:*:16484:0:99999:7:::
backup:*:16484:0:99999:7:::
list:*:16484:0:99999:7:::
irc:*:16484:0:99999:7:::
gnats:*:16484:0:99999:7:::
nobody:*:16484:0:99999:7:::
libuuid:!:16484:0:99999:7:::
syslog:*:16484:0:99999:7:::
messagebus:*:16484:0:99999:7:::
usbmux:*:16484:0:99999:7:::
dnsmasq:*:16484:0:99999:7:::
avahi-autoipd:*:16484:0:99999:7:::
kernoops:*:16484:0:99999:7:::
rtkit:*:16484:0:99999:7:::
saned:*:16484:0:99999:7:::
whoopsie:*:16484:0:99999:7:::
speech-dispatcher:!:16484:0:99999:7:::
avahi:*:16484:0:99999:7:::
lightdm:*:16484:0:99999:7:::
colord:*:16484:0:99999:7:::
hplip:*:16484:0:99999:7:::
pulse:*:16484:0:99999:7:::
myths:$6$GfWTYGIz$LmomqbhIzJbxA0arFMTs7r/JmIcZS8dyK1V4X/BilYTbqJecLYJWLTFTUoWcPKTF6iPH.kbj2ZDzSbb5d.PUE1:16618:0:99999:7:::
ftp:*:16708:0:99999:7:::
postfix:*:16709:0:99999:7:::
smmta:*:16709:0:99999:7:::
smmsp:*:16709:0:99999:7:::
guest-g1Jo1T:*:16711:0:99999:7:::

这是我的电脑上的文件,总体上和之前的文件一样,格式如下:

1
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

文件简析

登录名

是与/etc/passwd文件中的登录名相一致的用户账号。

口令

字段存放的是加密后的用户口令,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合{./0-9A-Za-z}中的字符,则对应的用户不能登录。
一般存放的字符串就是加密过的密码文件。就是实际密码经过hash算法后的值。开头的数表示他用的是哪一种hash(可以在 man crypt 中查看到):

  • 以$6$开头的,表明是用SHA-512加密的;
  • 以$1$开头的,表明是用MD5加密的;
  • 以$2$开头的,表明是用Blowfish加密的;
  • 以$5$开头的,表明是用 SHA-256加密的。星号代表帐号被锁定;
    如果是”*”或者”!”开头,则表示一般不能在Unix登陆。(呃。。不太清楚是啥意思)

最后一次修改时间

表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。一般这个时间起点是1970年1月1日。

密码不可被更动的天数

第四个栏位记录了这个帐号的密码需要经过几天才可以被变更!如果是 0 的话, 表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的!(没啥大用)

密码需要重新变更的天数

由于害怕密码被某些‘有心人士’窃取而危害到整个系统的安全,所以有了这个栏位的设计。 你必须要在这个时间之内重新设定你的密码,否则这个帐号将会暂时失效。 而如果像上面的 99999 的话,那就表示,啊哈,密码永远不需要重新输入啦! (无聊的设定)

密码需要变更期限前的警告期限

当帐号的密码失效期限快要到的时候, 就是上面那个‘必须变更密码’的那个时间时, 系统会依据这个栏位的设定,发出‘警告’言论给这个帐号,提醒他‘再过 n 天你的密码就要失效了,请尽快重新设定你的密码呦!’,如上面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。

密码过期的恕限时间

如果用户过了警告期限没有重新输入密码, 使得密码失效了,也就是说,你在‘必须变更密码的期限前,并没有变更你的密码!’ 那么该组密码就称为‘失效的密码’啰~怎么办?没关系,还有这个栏位的天数设计啊~ 意思就是说,当密码失效后,你还可以用这个密码在 n 天内进行登入的意思。 而如果在这个天数后还是没有变更密码,那么恭喜您的帐号已经失效了!

帐号失效日期

这个日期跟第三个栏位一样,都是使用 1970 年以来的总日数设定。这个栏位表示: 这个帐号在此栏位规定的日期之后,将无法再使用。 这个栏位会被使用通常应该是在‘收费服务’的系统中, 你可以规定一个日期让该帐号不能再使用啦!(坑)

保留

最后一个栏位是保留的,看以后有没有新功能加入。