我创建了一个bash脚本来哈希用户的密码。这些凭证存储在名为" usernamemdp.txt"的文件中。使用以下格式:
用户名1密码1
用户名2密码2
我的bash脚本创建两个输出文件,内容为:
username1 password1
username2 password2
表示第一个文件,名为" username.txt" (内容相同,使用小写用户名),并且:
username1 password1 sha512ofpassword1
username2 password2 sha512ofpassword2
表示第二个文件,名为" usernamesha.txt"
以下是脚本内容:
#!/bin/bash
#set input/output files variables
INFILE="usernamemdp.txt"
OUTFILE="username.txt"
OUTSHAFILE="usernamesha.txt"
#create and/or empty output files
> $OUTFILE
> $OUTSHAFILE
#loop through the input file
while read LINE; do
#take the first word as username, and lowercase it
USERNAME=$(echo $LINE | tr '[:upper:]' '[:lower:]' | awk '{print $1}')
#take the second word as password
REALPASS=$(echo $LINE | awk '{print $2}')
#hash the password
SHAPASSWORD=$(echo $REALPASS | openssl dgst -sha512)
#output to the first file
echo "$USERNAME $REALPASS" >> $OUTFILE
#output to the second file
echo "$USERNAME $REALPASS $SHAPASSWORD" >> $OUTSHAFILE
done < $INFILE
问题是散列密码永远不是我期望的密码。当我回显变量时,$REALPASS
没有尾随空格,但$SHAPASSWORD
不好。
我已尝试将openssl dgst -sha512
替换为mkpasswd -m sha512
,但结果相同。
当我在控制台上输入散列命令(echo -n bite | openssl dgst -sha512
)时,输出是正确的:
(标准输入)= 3c71cad6982778650fcecd4f37a34ef4349f6e01adaf3cddcb804856c92096b698411c42c7d68f9d6e380c0b487b4019203956496eaa7cac9ac96fdcf3d63dfd
当我运行脚本时,哈希密码不是我所期望的:
(标准输入)= 0e73a7f0a2c108e3f29cf3220a464e8cd7f515b99a65d77f1c82696342f77ba20345102a803686a81370b1a48302fc191055e215fa3ca1b0841571c924ff01ee
我怀疑echo
和$()
使用不当,但我被困住了,不理解我的错误。
我做错了什么?
答案 0 :(得分:4)
在剧本中:
SHAPASSWORD=$(echo $REALPASS | openssl dgst -sha512)
在文字中:
echo -n bite | openssl dgst -sha512
注意脚本中缺少-n
。最后的换行符将对摘要产生影响。
此外,您提到的错误的SHA512摘要是
的摘要bite\r\n
它不仅在结尾处有换行符,而且还有回车符。这可能来自在Windows机器上创建输入文件。
我没有仔细查看脚本的其余部分,除非注意到它不会处理包含空格的密码,因为awk
进行解析的方式(在空格上拆分)。
我建议您引用变量,并使用printf
,与echo
相比,它在shell中具有更一致的行为:
printf '%s' "$REALPASS" | ...
我还有点担心你将用户的密码以明文形式存储在文本文件中。已经有一个处理(登录)密码的系统。