Bash sha1带十六进制输入

时间:2014-04-12 12:10:29

标签: bash hex byte sha1

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

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

2 个答案:

答案 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”。

更新:我不确定整个脚本应该做什么,但我可以指出它有几个问题:

  • Shell变量,命令参数和c字符串通常不能包含空字节。在某些情况下,尾随换行符被修剪,而IIRC的某些早期版本的bash无法处理删除字符(十六进制7F)...基本上,不要尝试存储二进制数据(如stage2_hash中)或将其作为参数传递在shell中(如在./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$()在这里大多相互抵消,但却为两者之间的问题创造了机会。只需直接使用该命令即可。

清理它们,如果在清理后它不起作用,请尝试发布一个单独的问题。