使用十六进制输入Bash-sha1



我找到了这个构建哈希值的解决方案:

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

相关内容

  • 没有找到相关文章

最新更新