1./etc/passwd 文件详解
传统上,Linux把加密(哈希)的密码保存在/etc/passwd文件中,passwd文件的格式如下:
smithj:x:561:561:Joe Smith:/home/smithj:/bin/bash
共7个字段,由":"分隔, 各字段的含义如下:
- smithj,用户名,最多8个字符。区分大小写,通常全部小写
- 加密后的密码,空表示没有密码;“x"表示密码保存在/etc/shadow文件中
- 数字用户id。这是由“adduser”脚本分配的。Unix使用此字段以及以下组字段来标识哪些文件属于用户
- 数字组id。Red Hat以独特的方式使用组id,以增强文件安全性。通常,组id将与用户id匹配
- 用户全名。不确定这个字段的最大长度是多少,但请尽量保持合理(少于30个字符)
- 用户的主目录。通常为/home/username(例如/home/smithj)。所有用户的个人文件、网页、邮件转发等都将存储在此处。用户的shell
- 通常设置为“/bin/bash”,以提供对bash shell脚本的访问
2. /etc/shadow文件详解
shadow文件的每一行定义一个用户,共九个字段,格式如下:
{用户名}:{加密后的口令密码}:{口令最后修改时间距原点(1970-1-1)的天数}:{口令最小修改间隔(防止修改口令,如果时限未到,将恢复至旧口令):{口令最大修改间隔}:{口令失效前的警告天数}:{账户不活动天数}:{账号失效天数}:{保留}
root:$6$4rSdQWBy$970A61Zc6.5b1Ioh2Sl3dj/EbpKChilvqPsQz3h78YhcYnVoPQ9xXZeABlRLpfFsgTX0dlegSpC56LLqCPje41:0:0:99999:7:::
3. 密码字段的格式:
密码字段分为三个部分,由$分隔: $加密算法代号$盐值$密文
① 密码算法
序号 | 加密算法代号 | 算法 |
1 | $1$ | MD5 |
2 | $2a$ | Blowfish |
3 | $2y$ | Blowfish |
4 | $5$ | SHA-256 |
5 | $6$ | SHA-512 |
② 盐值
盐值的位数与加密算法有关,以SHA-512为例,盐值是一个Base64的随机串,串的长度是8~16的随机数。
Linux中加密由crypt()函数实现,crypt()会调用crypt_make_salt()函数生成盐值。盐值长度是一个个随机数,由shadow_random(8,16)函数产生。因此,Linux中加密密码的盐值的位数由程序自动生成,是不可配的。除非修改源码。
crypt_make_salt()--->gensalt(salt_size)---->l64a(random())生成Base64编码的,长度为salt_size的盐值字符串。
③ 密文
盐值+密码(明文)通过加密算法得到的字符串(Base64)。