账号密码相关文件
/etc/passwd # 用户账号信息 /etc/shadow # 用户的密码信息,此文件是有隐藏属性的,一定程度上保证了密码的安全 /etc/login.defs #用户密码相关配置,ENCRYPT_METHOD SHA512 此变量标明的密码加密的方式
centos7.9 默认的密码加密hash算法是 SHA512 但 密码并不是通过简单的算法,而是通过复杂的一系列逻辑
所以我们通过sha512 算出来的密码和shadow文件中的不一样
技巧:命令行获取目前密码使用的加密算法
authconfig --test| grep hash
/etc/passwd文件
每个用户一行,每行使用 ":" 分隔,共7个字段
- 账号名称
- 密码:早期密码直接放这里,但是这个文件所有程序都能读取,密码容易被窃取,所以所有密码数据改放到了 /etc/shadow,这里就是一个x
- UID:用户标识
- GID:用户组标识
- 用户信息说明
- 主文件目录
- shell,用户登录后会取得一个shell来和系统内核通信,完成用户操作
/etc/shadow 文件
每个用户一行,每行使用 ":" 分隔,共9个字段
- 账号名称
- 密码:加密之后的密码 注意:在此字段前面加上 ! 或 * 改变了密文长度 ,会让密码暂时失效,因为根据用户输入密码 加密后和此处的密码不相等
- 最近改动密码的日期:从1970-01-01 到改动日期的天数
- 密码不可被更改的天数:修改后多少天里不能再修改
- 密码修改更改的天数:隔多长时间修改修改密码
- 密码更改期限前的警告天数:密码过期前多少天开始通知用户
- 密码过期后,宽限时间:密码过期后多少天之内还能用
- 账号失效日期
- 保留字段
详解密码字段
以 $ 分隔,分为三段
- 加密方式:1:md5加密,密文长度22 5:sha256加密,密文长度43 6:sha512加密,密文长度86 4:手动上传password字符串
- 盐值:hash加密时使用的salt
- 密文
密码密文生成方式
密码密文并不是简单地使用算法生成的,是有一系列复杂的运算的,由于linux是开源的,所以有一些工具帮我们实现了这个功能,使用passwd 等命令修改密码时,系统会自动生成密码密文
目前:admin用户的密码是:#PK1UxTBDZ
salt:$6$6FeAs/Nsgr3/$
1、dovecot包中的doveadm命令的子命令 doveadm pw
doveadm pw -s SHA512-CRYPT -p '#PK1UxTBDZ'
{SHA512-CRYPT}$6$KSUkKq1yJ7.EwwCk$IdOteWBK/zOXmLPaYM9VY7mXNw.LBm2Trj3YNpNk7ZFiAAyiMYA/yDJzKsL1UN0kFgEg.yMJiRLe5fMnwlkFd1
# 盐值变了,没找到这个命令加盐的方式,所以密文和上面不一样,但是用上面的密文替换 /etc/shadow 中的密文,是完全可以使用的,系统是从/etc/shadow 中取盐值的
2、openssl 中的passwd子命令
默认是使用unix标准的加密方式去加密的,但只允许8个字符(应该有参数去改变),这个密文放在 /etc/shadow 也是可以用的
# 用md5 加密
openssl passwd -1 '#PK1UxTBDZ' $1$ovun1wSt$SwYNeqgzJhkKyteY/nfvq/
3、python 自带的crypt库
import crypt
crypt.crypt('#PK1UxTBDZ', '$6$6FeAs/Nsgr3/$')
#结果:可以看到,和/etc/shadow中的密文字段完全一样 '$6$6FeAs/Nsgr3/$8uz9LiP0A6SnEC1KvJKYcdxJi/QaI1b4t2QieaWxS9oatx7SBV1myg7mxH4jLXFr/C.TBTI8xiHYb5Q11tx1w0'
修改密码
1、交互式修改
passwd admin # 密码中可以包含特殊字符
2、直接修改
echo "admin:123456asd" | chapasswd # 密码中有些特殊字符的组合可能造成最后的密文和正确的密文不一样,chpasswd 会将密码进行加密然后存到 /etc/shadow, 如果有特殊字符,chpasswd读取可能有问题,
echo "admin:123456asd" | chapasswd -m # chpasswd 加密密码时,使用md5算法
echo "admin:123456asd" | chapasswd -c sha256 # chpasswd 加密密码时,使用sha256算法
echo "admin:密文" | chapasswd -e # 此时密码已经是加密的,只需要chpasswd 将密文存到 /etc/shadow,密文中的特殊字符,chpasswd读取可能有问题
echo "123456asd" | passwd --stdin admin # 特殊字符可能会导致修改的密码和你输入的密码不一致