如何知道密码是否与Linux系统密码一致?

Bash

1 前言

一个问题,一篇文章,一出故事。
笔者最近需要研究在Linux Shell环境下,当系统用户输入密码后,Shell脚本需要如何判断该用户输入的密码是否与当前系统一致。

2 基础知识

2.1 密码文件的说明

echo "123456" | passwd --stdin User01
grep User01 /etc/shadow

以上命令设置“User01”的密码为“123456”并读取该用户的密码条目,可见如下输出,

User01:$6$slknEwliGPQMRa.i$/3LtYCe67wA0hOzYScw6tQQVmcJytQrwMR3c34NIld.eAJ98Tsx/pDA0tAwcgm.bFpgvIZSRw2W8/6OPwpt750:19432:0:99999:7:::

关于文件“/etc/shadow”,我们需要注意的是,
– 该文件用于存储系统用户名对应的密码(使用哈希加密)等信息
– 该文件中的每行代表一个用户对象
– 该文件中的每行的每一个字段使用“:”分隔,所以第一列是用户名,第二列是密码(其他暂时忽略)

2.2 密码字段的说明

grep User01 /etc/shadow | cut -d":" -f2

以上命令用于提取面字段,可见如下输出,

$6$slknEwliGPQMRa.i$/3LtYCe67wA0hOzYScw6tQQVmcJytQrwMR3c34NIld.eAJ98Tsx/pDA0tAwcgm.bFpgvIZSRw2W8/6OPwpt750

需要注意的是,
– 密码字段使用“$”分隔,即格式是“$<ID>$<SALT>$<HASH>”
– 密码字段的第1列用于声明算法标识符(即ID,范例中为“6”),另外详细对应关系如下,
— ID“1”对应“MD5”
— ID“2a”对应“Blowfish”
— ID“5”对应“SHA-256”
— ID“6”对应“SHA-512”
— ID“y”对应“yescrypt”
– 密码字段的第2列用于声明增强哈希函数的随机盐(SALT)
– 密码字段的第3列用于声明哈希函数转换原始密码生成的哈希值(HASH)
另外,在RHEL 8中的密码字段的值可使用如下命令生成,

echo "123456" | openssl passwd -6 -stdin

你需要知道的是,
– 参数“-6”声明使用“SHA-512”的哈希函数生成哈希字符串
– 参数“-stdin”声明接收标准输入流中输入(接收前面echo输出的密码)
– 参数“-salt”不声明则使用随机值,所以命令多次生成的值是不一致的(要一致使用相同的盐值即可)

2.3 提取系统密码文件的盐值

grep User01 /etc/shadow | cut -d":" -f2 | cut -d'$' -f3

命令可见如下输出,

slknEwliGPQMRa.i

2.4 命令加盐生成散列密码

echo "123456" | openssl passwd -6 -stdin -salt "slknEwliGPQMRa.i"

以上命令接之前的知识,用盐生成散列密码与“/etc/shadow”文件的一致,可见如下输出,

$6$slknEwliGPQMRa.i$/3LtYCe67wA0hOzYScw6tQQVmcJytQrwMR3c34NIld.eAJ98Tsx/pDA0tAwcgm.bFpgvIZSRw2W8/6OPwpt750

3 最佳实践

3.1 创建判断脚本

vim ~/scripts/comparisonHash.sh

加入脚本,

#/bin/bash

read -p 'Please type username: ' userName
read -sp 'Please type password: ' userPassword

shadowSalt=`grep "$userName" /etc/shadow | cut -d":" -f2 | cut -d'$' -f3`
typePasswordHash=`echo "$userPassword" | openssl passwd -6 -stdin -salt "$shadowSalt"`
shadowPasswordHash=`grep "$userName" /etc/shadow | cut -d":" -f2`

echo -e "\n"
if [ "$typePasswordHash" = "$shadowPasswordHash" ]; then
        echo "Hashes are completely same,"
else
        echo "Hashes are completely different,"
fi
echo "Type Password Hash: $typePasswordHash"
echo "Shadow Password Hash: $shadowPasswordHash"

3.2 测试运行

sh ~/scripts/password.sh

加入脚本,

Please username: User01
Please password: 123456

hashes are completely same,
shadow password Hash: $6$slknEwliGPQMRa.i$/3LtYCe67wA0hOzYScw6tQQVmcJytQrwMR3c34NIld.eAJ98Tsx/pDA0tAwcgm.bFpgvIZSRw2W8/6OPwpt750
input password Hash: $6$slknEwliGPQMRa.i$/3LtYCe67wA0hOzYScw6tQQVmcJytQrwMR3c34NIld.eAJ98Tsx/pDA0tAwcgm.bFpgvIZSRw2W8/6OPwpt750
没有评论

发表回复

Bash
如何收集活跃的RHDS客户端IP地址?

1 前言 一个问题,一篇文章,一出故事。 笔者最近接到需要收集RHDS服务活跃的IP地址的工作任务, …

Bash
如何用Tigase监控postfix smtp服务?

1 前言 一个问题,一篇文章,一出故事。 笔者生产中的smtp服务器最近因为负载均衡器的路由故障而导 …

Bash
如何用Tigase监控Elasticsearch集群?

1 前言 一个问题,一篇文章,一出故事。 笔者生产中有一套Elasticsearch集群,笔者为了能 …