Bash文件:while循环中错误的SHA512哈希

时间:2017-09-03 16:03:35

标签: bash

我创建了一个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$()使用不当,但我被困住了,不理解我的错误。 我做错了什么?

1 个答案:

答案 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" | ...

我还有点担心你将用户的密码以明文形式存储在文本文件中。已经有一个处理(登录)密码的系统。