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
没有评论