遇到一个问题

今天遇到一个问题:如何判断shadow文件中存储的密码是明文还是密文?

进而发散了一个问题:Linux是否支持明文密码认证?

第一个问题:区分明文、密文

一般情况下,Linux的shadow文件中存储的密码都是密文,并且很容易区分加密算法、加密盐值以及加密串:

$6$SALT$io0TPmhM8ythCm7Idt0AfYvTuFCLyA1CMVmeT3EUqarf2NQcTuLKEgP9.4Q8fgClzP7OCnyOY1wo1xDw0jtyH1

如上,是通过$关键字分割的。常见的加密算法列表:

$1 :Message Digest 5 (MD5)
$2 :Blowfish(最早的版本,有一些缺陷,不推荐使用)
$2a :Blowfish(修复了一些缺陷后的版本,但仍然有一些问题,不推荐使用)
$2b :Blowfish(修复了2a中的问题后的版本,是安全、常用的版本)
$2y :Blowfish(Eksblowfish版本)
$5 :256-bit Secure Hash Algorithm (SHA-256)
$6 :512-bit Secure Hash Algorithm (SHA-512)
$y (or $7):Yescrypt(Blowfish加密方式的一个变种,提供了更高的安全性和性能)
$sm3 :SM3

值得一说的是:
截至目前,yescrypt 及其竞赛版本 yescrypt v2 和当前的规范已被广泛采用,并成为许多最新版本主要发行版的默认密码哈希方案,如 Debian 11、Fedora 35+、Kali Linux 2021.1+ 和 Ubuntu 22.04+。此外,它也受到 Fedora 29+ 和 RHEL 9+ 的支持。然而,许多标准工具仍不支持 yescrypt。

当然,如果存储的密文都是这样的,那就没了问题,也很好去区分明文还是密文。凡事就有个不一般: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 文件通常存储的是经过加密或哈希处理的密码哈希值,而不是明文密码。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐