本文描述了Linux用户和密码保存机制。

Linux用户信息保存在/etc/passwd文件,普通用户即可读。使用cat /etc/passwd查看文件内容,可以看到有类系用户信息:

mchen:x:1000:1000:mchen,,,:/home/mchen:/bin/bash

每个用户信息使用:分隔,其中

  • mchen:用户名
  • x: 表示密码保存在文件/etc/shadow
  • 第一个1000: 用户ID(UID)
  • 第二个1000: 用户组ID(GID)
  • 第二个mchen: 用户额外信息,例如用户全名等
  • /home/mchen: 用户home directory的路径
  • /bin/bash: 用户使用的bash

上文提到如果用户设置了密码的话,密码保存在/etc/shadow文件中。需要使用su用户权限才能查看: sudo cat /etc/shadow,可以看到每个用户的密码信息:

mchen:$6$JAnK7uhM$8/eo5ptVkIZbRyJ.HOGG4RHHgvl6iVpufBfM47hviWEeZ8C/aYA50x.wS5m.Uxu.PXUwEdd/7X0per5mWmo7v.:17655:0:99999:7:::

其中,

  • mchen: 用户名
  • 密码使用$id$salt$hash方式保存
    • $1$: MD5
    • $2a$: BLOWFISH
    • $2y$: BLOWFISH
    • $5$: SHA-256
    • $6$: SHA-512
  • 可以看到这里是$6$,所以是以SHA-512保存的
  • JAnK7uhM: salt(加盐)
  • 8/eo5ptVkIZbRyJ.HOGG4RHHgvl6iVpufBfM47hviWEeZ8C/aYA50x.wS5m.Uxu.PXUwEdd/7X0per5mWmo7v.: 以SHA-512保存的密码
  • 17655: 上一次修改密码的天数(从1970/1/1开始计算)
  • 0: 最短时间内需要修改密码的天数
  • 99999: 最长时间需要修改密码的天数
  • 7: 密码过期前提前通知的天数

本文参考了:12