遇到一个问题
今天遇到一个问题:如何判断shadow文件中存储的密码是明文还是密文?
进而发散了一个问题:Linux是否支持明文密码认证?
第一个问题:区分明文、密文
一般情况下,Linux的shadow文件中存储的密码都是密文,并且很容易区分加密算法、加密盐值以及加密串:
$6$SALT$io0TPmhM8ythCm7Idt0AfYvTuFCLyA1CMVmeT3EUqarf2NQcTuLKEgP9.4Q8fgClzP7OCnyOY1wo1xDw0jtyH1
如上,是通过$关键字分割的。常见的加密算法列表:
$1 :MD5
$2 :Blowfish(最早的版本,有一些缺陷,不推荐使用)
$2a :Blowfish(修复了一些缺陷后的版本,但仍然有一些问题,不推荐使用)
$2b :Blowfish(修复了2a中的问题后的版本,是安全、常用的版本)
$2y :Blowfish(Eksblowfish版本)
$5 :SHA-256
$6 :SHA-512
$y :Yescrypt(Blowfish加密方式的一个变种,提供了更高的安全性和性能)
$sm3 :SM3
当然,如果存储的密文都是这样的,那就没了问题,也很好去区分明文还是密文。凡事就有个不一般:DES加密串是这样式儿的:
yviVMljz3DakQ
很普通的随机串,大小写字母、数字、特殊字符组成,长度固定为13位。但是,明文密码也可以是这样的,虽然明文要更加易读,程序却很难区分,只有一个固定13位长度比较明显。
第二个问题:支持明文密码认证吗?
只能做实验了。
实验一:存储明文密码并登录系统(失败)
useradd user1 --password 12345678
,该命令会将12345678存储在shadow文件中,格式如下:
user1:12345678:19786:0:99999:7:::
然后su - user1切换用户登录,输入密码12345678,认证失败:
notice|unix_chkpwd[1328628]|password check failed for user (user1)
notice|su[-]|pam_unix(su-l:auth): authentication failure; logname=root uid=1000 euid=0 tty=pts/0 ruser=user1 rhost= user=user1
实验二:存储DES加密串并登录系统(成功)
echo 'user1:12345678' | chpasswd --crypt-method DES
,该命令会将shadow中user1的密码以DES加密串的形式存储:
user1:WAyc3fcyUgCqc:19786:0:99999:7:::
su - user1切换用户登录,输入密码12345678,成功登录:
pam_unix(su-l:session): session opened for user user1(uid=3001) by root(uid=3001)
实验三:调整PAM配置以支持明文(失败)
调整了半天,更换了各种参数,除了将system-auth中的auth required pam_deny.so行注释掉(这么干的话,不管你密码输入的是啥都会成功登录),其他各种配置均都登录失败。
结论:
在大多数情况下,现代的 Linux 系统不支持将密码以明文形式存储在 /etc/shadow 文件中。在 Linux 中,/etc/shadow 文件通常存储的是经过加密或哈希处理的密码哈希值,而不是明文密码。