我找到了这个构建哈希值的解决方案:
echo -n wicked | shasum | awk '{print $1}'
但这只适用于字符串输入。我不知道如何将输入转换为十六进制,例如,如果我想构建sha1值的sha1值。
upd:我刚刚发现shasum有-b
选项,但它产生了错误的输出。它是否期望字节具有反向端序?
upd2:例如:我进行以下输入:
echo -n 9e38cc8bf3cb7c147302f3e620528002e9dcae82 | shasum -b | awk '{print $1}'
输出是bed846bb1621d915d08eb1df257c2274953b1ad9
,但根据哈希计算器,输出应该是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
您可以使用xxd -r -p
将十六进制转换为二进制:
echo -n 9e38cc8bf3cb7c147302f3e620528002e9dcae82 | xxd -r -p | shasum -b | awk '{print $1}'
请注意,其输出为9d371d148d9c13050057105296c32a1368821717;这与我使用哈希计算器对9e38cc8bf3cb7c147302f3e620528002e9dcae82进行哈希计算得到的结果相匹配。从bash计算器中得到的值似乎是复制粘贴错误的结果,特别是在十六进制字符串中去掉了最后一个"2"。
更新:我不确定整个脚本应该做什么,但我可以指出它的几个问题:
- 外壳变量、命令参数和c字符串通常不能包含null字节。还有一些情况下,尾部换行符被修剪,IIRC一些早期版本的bash无法处理删除字符(hex 7F)。。。基本上,不要试图在shell中存储二进制数据(如stage2_hash中)或将其作为参数传递(如./xor.sh中)。另一方面,管道可以很好地传递原始二进制文件。因此,将其存储在十六进制中,然后使用
xxd -r -p
将其转换为二进制,并通过管道将其直接发送到目的地 - 当扩展shell变量(
$password
)或使用命令替换($(somecommand)
)而不将其用双引号括起来时,shell会对其进行一些额外的解析(如将空格转换为分词、将通配符扩展为匹配文件名的列表等)。这几乎不是你想要的,所以总是用双引号把变量引用之类的东西括起来 - 不要将
echo
用于任何不平凡的事情,并期望它的行为一致。根据您拥有的echo
的版本和/或密码,echo -n "$password"
可能会在打印密码后不带换行符,也可能在打印前带"-n",在打印后带换行符;可能会对密码中的任何反斜杠序列执行某些操作,或者(如果密码以"-"开头)将密码本身解释为echo命令的更多选项。请改用printf "%s" "$password"
- 不要使用
echo $(somecommand)
(甚至是printf "%s" "$(somecommand)"
)。echo
和$()
在这里基本上是相互抵消的,但却为两者之间的问题创造了机会。直接使用命令即可
把它们清理干净,如果清理后不起作用,试着发布一个单独的问题。
openssl
命令可能会对您有所帮助。参见bash中的HMAC-SHA1类似:
echo -n wicked | openssl dgst -sha1