[root@dltasvm001jeguan ~]# cat /etc/shadowroot:$6$NFqoUq77$Q1Fyyf.seeQEMSUamP4t/znmHW5/FaAJ9x.EgknCp1r8EObMJoRgDrBQvljhGzwo1Bp2ehe4woAv.p6YKoxTz1:16297:0:99999:7:::......rdb:lsslss:16836:7:90:7::: [root@dltasvm001jeguan ~]# cat /etc/passwdroot:x:0:0:root:/root:/bin/bash......rdb:x:1002:1003::/home/rdb:/bin/bash
Linux /etc/shadow文件中的记录行与/etc/passwd中的一一对应,存放着用户的密码哈希值。它由pwconv命令根据/etc/passwd中的数据自动产生。它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用“:”隔开。这些字段是:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
1)“登录名”是与/etc/passwd文件中的登录名相一致的用户账号
2)“口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合{./0-9A-Za-z}中的字符,则对应的用户不能登录。
3)“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCOLinux中,这个时间起点是1970年1月1日。
4)“最小时间间隔”指的是两次修改口令之间所需的最小天数。
5)“最大时间间隔”指的是口令保持有效的最大天数。
6)“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
7)“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
8)“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
其中shadow中存放的密码密文格式如下:
$id$salt$encrypted
其中id是指使用的哈希算法:
可取如下值:
ID | Method
--------------------------
1 | MD5
2a | Blowfish (not in mainline glibc; added in some
| Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
salt:是使用上面hash算法对密码进行hash的一个干扰值。
encrypted: 这个值即 密码的hash, 但不是直接的hash("passwd"),而是hash("passwd+salt")后,再经过编码。
实际应用:
1. 在有shadow文件的前提下暴力破解(也只能暴力破解)用户密码
2. 实现自己的passwd命令。某种场景下是很有用的(在云计算中,可以方便的为使用同一模板的linux虚拟机生成不同密码)
想查看某一个用户(比如rdb)的密码到期失效信息,运行下面这个命令。请注意:只有在你检查你自己之外的其他任何用户的密码有效期信息时,才需要根用户权限
[root@dltasvm001jeguan ~]# chage -l rdbLast password change : Feb 05, 2016Password expires : May 05, 2016Password inactive : neverAccount expires : neverMinimum number of days between password change : 7Maximum number of days between password change : 90Number of days of warning before password expires : 7
迫使用户更改密码
如果你想迫使用户更改其密码,请使用下面这个命令。
- $ sudo chage -d0 <user-name>
最初,“-d <N>”选项应该被设成密码的“有效期”(自密码上一次更改时间1970年1月1日以来的天数)。所以,“-d0”表明该密码是在1970年1月1日更改的,这实际上让当前密码到期失效,从而让密码在下一次登录时被更改。
让当前密码到期失效的另一个办法是通过passwd命令。
- $ sudo passwd -e <user-name>
上述命令具有与“chage -d0”同样的功效,让用户的当前密码立即到期失效。
现在,再次检查用户的密码信息,你会看到:[root@dltasvm001jeguan ~]# chage -l rdbLast password change : password must be changedPassword expires : password must be changedPassword inactive : password must be changedAccount expires : neverMinimum number of days between password change : 7Maximum number of days between password change : 90Number of days of warning before password expires : 7[root@dltasvm001jeguan ~]#