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

Bash文件:while循环中的SHA512哈希错误,bash,Bash,我创建了一个bash脚本来散列用户的密码。这些凭据存储在名为“usernamemdp.txt”的文件中,格式如下: 用户名1密码1 用户名2密码2 我的bash脚本创建两个输出文件,内容如下: 用户名1密码1 用户名2密码2 对于第一个名为“username.txt”的文件(内容相同,使用小写用户名),以及: 用户名1密码1 SHA512密码1 用户名2密码2 SHA512密码2 第二个文件名为“usernamesha.txt” 以下是脚本内容: #!/bin/bash #set input/o

我创建了一个bash脚本来散列用户的密码。这些凭据存储在名为“usernamemdp.txt”的文件中,格式如下:

用户名1密码1

用户名2密码2

我的bash脚本创建两个输出文件,内容如下:

用户名1密码1

用户名2密码2

对于第一个名为“username.txt”的文件(内容相同,使用小写用户名),以及:

用户名1密码1 SHA512密码1

用户名2密码2 SHA512密码2

第二个文件名为“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
#/bin/bash
#设置输入/输出文件变量
infle=“usernamemdp.txt”
OUTFILE=“username.txt”
OUTSHAFILE=“usernamesha.txt”
#创建和/或清空输出文件
>$OUTFILE
>$OUTSHAFILE
#循环浏览输入文件
读行时;做
#将第一个单词作为用户名,并将其小写
用户名=$(echo$行| tr'[:上限:'[:下限:''.| awk'{print$1}')
#将第二个单词作为密码
REALPASS=$(echo$行| awk'{print$2}')
#散列密码
SHAPASSWORD=$(echo$REALPASS | openssl dgst-sha512)
#输出到第一个文件
echo“$USERNAME$REALPASS”>>$OUTFILE
#输出到第二个文件
echo“$USERNAME$REALPASS$SHAPASSWORD”>>$OUTSHAFILE
完成<$infle
问题是,哈希密码从来不是我期望的密码。当我回显变量时,
$REALPASS
没有尾随空格,但
$SHAPASSWORD
不好。 我试图用
mkpasswd-msha512
替换
openssldgst-sha512
,但结果是一样的

在控制台上键入哈希命令(
echo-n bite | openssl dgst-sha512
)时,输出正确:

(标准文本)= 3C71CAD6982778650FCECD4F37A34EF4349F6E01ADAF3CDDC804856C92096B698411C42C7D68F9D6E380C0B487B4019203956496EAA7CAC96FDCF3D63DFD

当我运行脚本时,哈希密码不是我所期望的:

(标准文本)= 0E73A7F0A2C108E3F29CF3220A464E8CD7F515B99A65D77F1C82696342F7BA20345102A8036866A81370B1A48302FC191055E215FA3CA1B0841571C924FF01EE

我怀疑
echo
$()
的用法不好,但我被卡住了,不理解我的错误。 我做错了什么?

在脚本中:

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" | ...
另外,我有点担心的是,您将用户密码以明文形式存储在文本文件中。已经有一个处理(登录)密码的系统。

在脚本中:

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

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

请注意,这种幼稚的sha512方法是一种非常不安全的密码散列方法。sha512crypt是安全的,但与此非常不同。@TheotherGuy你能详细解释一下为什么这是一种“非常不安全的散列单词方式”吗?解释了当你不加盐和拉伸散列时会发生什么。Tl;dr:使用一个受人尊敬的库,它知道如何防止gpu破解和预计算攻击。不要上当我同意你关于密码安全的说法,但我没有要求密码安全提示,因为当我只有2便士的时候,我真的不需要/想要一个昂贵、复杂、耗时、防攻击的保险箱。。。无论如何,感谢您提供有关salt密码哈希的大量资源。请注意,这种幼稚的sha512方法是一种非常不安全的密码哈希方法。sha512crypt是安全的,但与此非常不同。@TheotherGuy你能详细解释一下为什么这是一种“非常不安全的散列单词方式”吗?解释了当你不加盐和拉伸散列时会发生什么。Tl;dr:使用一个受人尊敬的库,它知道如何防止gpu破解和预计算攻击。不要上当我同意你关于密码安全的说法,但我没有要求密码安全提示,因为当我只有2便士的时候,我真的不需要/想要一个昂贵、复杂、耗时、防攻击的保险箱。。。无论如何,感谢您提供了大量关于salt密码散列的资源。密码是临时存储的,用于SQL插入。当我在脚本中使用echo-n$REALPASS | openssl…时,哈希值不正确。我用
printf“%s'$REALPASS”|…
进行了测试,结果不正确,与echo'e不同