使用十六进制输入的Bash sha1

5
我找到了一个构建哈希值的解决方案:
echo -n wicked | shasum | awk '{print $1}'

但是这只适用于字符串输入。我不知道如何处理十六进制的输入,例如如果我想要构建sha1值的sha1值。

更新:我刚刚发现shasum有-b选项,但它产生了错误的输出。它是否期望字节以相反的字节序传输?

更新2:例如:我进行以下输入:

echo -n 9e38cc8bf3cb7c147302f3e620528002e9dcae82 | shasum -b | awk '{print $1}'

输出结果为bed846bb1621d915d08eb1df257c2274953b1ad9,但根据哈希计算器的计算,输出应该为9d371d148d9c13050057105296c32a1368821717
更新3:选项-b似乎完全不起作用。无论我是否使用此参数,都会得到相同的结果。
更新4:整个脚本如下所示。由于我分配或连接时去掉了空字节,因此它不起作用。
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

openssl 命令可能会对您有所帮助。请参见 bash 中的 HMAC-SHA1 - Farvardin
2个回答

6
您可以使用xxd -r -p将十六进制转换为二进制:
echo -n 9e38cc8bf3cb7c147302f3e620528002e9dcae82 | xxd -r -p | shasum -b | awk '{print $1}'

请注意,输出结果为9d371d148d9c13050057105296c32a1368821717;这与使用哈希计算器将9e38cc8bf3cb7c147302f3e620528002e9dcae82进行哈希运算所得到的结果相同。看起来,你从bash计算器中获取的值是由于复制粘贴错误而导致的,具体来说是在十六进制字符串中漏掉了最后的“2”。
更新:我不确定整个脚本应该做什么,但我可以指出其中的几个问题:
  • Shell变量、命令参数和C字符串一般不能包含空字节。还有一些情况下会修剪尾随的换行符,并且我IRC(如果我没记错的话),一些早期版本的bash无法处理删除字符(十六进制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$()大部分是互相抵消的,但是在它们之间创建了问题的机会。直接使用该命令即可。
清理这些问题,如果清理后仍然无法正常工作,请发布一个单独的问题。

谢谢你的提示,我已经修正了我的问题。这对于这个例子有效,但是我有一个更复杂的问题,我需要连接两个字符串,然后将它们传递给sha1算法。其中一个字符串有一个空字节,在连接后被删除了。或者如果我将它赋值给一个变量,它也会被删除。请查看更新以了解我的意思。 - Danny Lo

4

根据openssl手册的说明,我只能影响输出,而不能影响输入。 - Danny Lo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接