详细解析/etc/shadow文件尤其是加密密码字段
/etc/shadow,是 Linux系统中的重要系统文件,用于存储加密的用户密码,并且只有系统管理员 root 用户可以访问,防止未经授权的用户查看或者修改该文件。每一行对应每个用户(包括系统用户)的用户密码信息。
# cat /etc/shadow
root:$6$pMbKgN..OICeIjTJ$oLxZ3Y5luz8BqF4pYrQn0IrQhOZ7mcyMo69/.VTbhZqmCaJcPxjIW.Y5nPoKCa0vmrS9b0zMp8ElLSiQ6eqAA.::0:99999:7:::
该文件的每一行包含 9 个字段,以冒号 (“:”) 分隔,下面逐一解释每个字段:
用户名
该用户名必须是系统上存在的有效的用户名。
加密密码
如果该密码字段包含一些非法的字符或者字符串,例如!或 *,这将导致该密码失效,也就是该用户将无法使用 密码登录。
此字段可能为空,在这种情况下,无需密码即可作为指定的用户进行身份验证。然而,一些应用程序 如果密码字段为空,读取 /etc/shadow 文件可能决定根本不允许任何访问。
如果用感叹号!开头的密码字段表示密码已锁定。该用户将不能登录。行中剩余的字符代表密码被锁定之前的密码字段。
如果 salt 是一个以字符“$id$”开头的字符串,后跟一个以“$”结尾的字符串, 然后不使用 DES ,id 标识使用的加密方法,然后确定如何解释密码字符串的其余部分:
$id$salt$encrypted
$id可能为:
1 MD5
2a Blowfish
5 SHA-256
6 SHA-512
所以,比如 $5$salt$encrypted 是一个 SHA-256 编码的密码,而 $6$salt$encrypted 是一个 SHA-512 编码的密码。
"salt" 代表 salt 中 "$id$" 后面最多 16 个字符。 密码字符串的加密部分是实际计算的密码, 这个字符串的大小是固定的:
MD5 22 个字符
SHA-256 43 个字符
SHA-512 86 个字符
上次更改密码的日期
需要注意的是该日期为自 1970 年 1 月 1 日 00:00 UTC 以来的天数。
值 0 具有特殊含义,即用户下次登录系统时应更改密码。
空字段表示禁用密码老化功能。
最短密码使用期限
密码最短使用期限是用户在被允许再次更改密码之前必须等待的天数。
空字段和值 0 表示没有最短密码期限。
最大密码期限
密码最长使用期限是用户必须更改密码的天数。经过此天数后,密码可能仍然有效。下次登录时应要求用户更改密码。
空字段表示没有密码最长使用期限、密码警告期限和密码不活动期限。
如果密码最长使用期限小于密码最短使用期限,则用户无法更改其密码。
密码警告期
密码到期前的天数(请参阅上面的最大密码使用期限),在此期间应警告用户。
空字段和值为 0 表示没有密码警告期。
密码不活动期
密码过期后的天数(请参阅上面的最长密码使用期限),在此期间密码仍应被接受(以及 用户应在下次登录时更新她的密码)。
密码到期且该有效期已过后,用户将无法登录。
空字段表示不执行不活动期。
账户到期日
帐户的到期日期,表示为自 1970 年 1 月 1 日 00:00 UTC 以来的天数。请注意,帐户到期与密码到期不同。账户到期时,用户将无法登录。 如果密码过期,则不允许用户使用她的密码登录。
空字段表示该帐户永不过期。
不应使用值 0,因为它被解释为没有到期的帐户或 1970 年 1 月 1 日到期的帐户。
保留字段
该字段保留供将来使用。