我找到了构建哈希值的解决方案:
echo -n wicked | shasum | awk '{print $1}'
但这仅适用于字符串输入。我不知道如何将输入作为十六进制输入,例如,如果我想构建sha1值的sha1值。
upd:我刚发现shasum有选项-b
,但它会产生错误的输出。它是否期望具有反向字节序的字节?
upd2:例如:我执行以下输入:
echo -n 9e38cc8bf3cb7c147302f3e620528002e9dcae82 | shasum -b | awk '{print $1}'
输出为bed846bb1621d915d08eb1df257c2274953b1ad9
,但根据hash calculator,输出应为9d371d148d9c13050057105296c32a1368821717
upd3: -b
选项似乎根本不起作用。我是否应用此参数没有区别,我得到相同的结果。
upd4:整个脚本如下所示。它不起作用,因为无论是分配还是连接都会删除空字节。
password="wicked"
scrumble="4d~k|OS7T%YqMkR;pA6("
stage1_hash=$(echo -n $password| shasum | awk '{print $1}')
stage2_hash=$(echo $(echo -n $stage1_hash | xxd -r -p | shasum | awk '{print $1}') | xxd -r -p)
token=$(./xor.sh $(echo -n $scrumble$(echo 9d371d148d9c13050057105296c32a1368821717 | xxd -r -p) | shasum | awk '{print $1}') $stage1_hash)
echo $token
答案 0 :(得分:3)
openssl
命令可以帮助您。见HMAC-SHA1 in bash
像:
echo -n wicked | openssl dgst -sha1
答案 1 :(得分:3)
您可以使用xxd -r -p
将十六进制转换为二进制:
echo -n 9e38cc8bf3cb7c147302f3e620528002e9dcae82 | xxd -r -p | shasum -b | awk '{print $1}'
请注意,此输出为9d371d148d9c13050057105296c32a1368821717;这与使用hash calculator散列9e38cc8bf3cb7c147302f3e620528002e9dcae82得到的结果相符。看来你从bash计算器获得的值是复制粘贴错误的结果,特别是在十六进制字符串中留下最后的“2”。
更新:我不确定整个脚本应该做什么,但我可以指出它有几个问题:
xxd -r -p
转换为二进制文件,并将其直接传送到目标。$password
)或使用命令替换($(somecommand)
)而不将其包装在双引号中时,shell会对其进行一些额外的解析(例如将空格转换为单词分解,将通配符扩展为匹配文件名列表等)。这几乎不是你想要的,所以总是用双引号包装变量引用之类的东西。echo
用于任何非常重要的事情,并期望它的行为一致。根据您拥有的echo
版本和/或密码的大小,echo -n "$password"
可能会在没有换行符的情况下打印密码,或者可能在其之前使用“-n”打印密码并在之后换行,可能对密码中的任何反斜杠序列执行某些操作,或者(如果密码以“ - ”开头)将密码本身解释为echo命令的更多选项。请改用printf "%s" "$password"
。echo $(somecommand)
(甚至printf "%s" "$(somecommand)"
)。 echo
和$()
在这里大多相互抵消,但却为两者之间的问题创造了机会。只需直接使用该命令即可。清理它们,如果在清理后它不起作用,请尝试发布一个单独的问题。