【问题标题】:Bash sha1 with hex input带有十六进制输入的 Bash sha1
【发布时间】:2014-05-26 15:33:48
【问题描述】:

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

echo -n wicked | shasum | awk '{print $1}'

但这仅适用于字符串输入。我不知道如何将输入处理为十六进制,例如,如果我想构建 sha1-value 的 sha1-value。

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

【问题讨论】:

标签: bash hex byte sha1


【解决方案1】:

您可以使用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)或将其作为参数传递(如在 ./xor.sh 中)在 shell 中。另一方面,管道可以很好地传递原始二进制文件。所以将其存储为十六进制,然后使用xxd -r -p 转换为二进制并将其直接通过管道传输到其目的地。
  • 当您扩展 shell 变量 ($password) 或使用命令替换 ($(somecommand)) 而不用双引号括起来时,shell 会对其进行一些额外的解析(例如将空格变成分词符、扩展通配符到匹配文件名列表等)。这几乎不是您想要的,因此请始终将变量引用之类的内容用双引号括起来。
  • 不要将echo 用于任何重要的事情,并期望它的行为始终如一。根据您拥有的echo 的版本和/或密码是什么,echo -n "$password" 可能会打印密码而不在其后添加换行符,或者可能会在其前使用“-n” 并在其后添加换行符来打印它,可能会做一些事情在密码中包含任何反斜杠序列,或者(如果密码以“-”开头)将密码本身解释为 echo 命令的更多选项。请改用printf "%s" "$password"
  • 不要使用echo $(somecommand)(甚至是printf "%s" "$(somecommand)")。 echo$() 在这里大多相互抵消,但在两者之间为问题创造机会。直接使用命令即可。

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

【讨论】:

  • 感谢您的提示,我解决了我的问题。这适用于这个例子,但我有一个更复杂的例子,我需要连接 2 个字符串,然后将它们传递给 sha1-algorithm。其中一个字符串有一个空字节,并且在连接后将被删除。或者,如果我将它分配给一个变量,它也会被删除。查看更新以了解我的意思。
【解决方案2】:

openssl 命令可以帮助你。见HMAC-SHA1 in bash 喜欢:

 echo -n wicked | openssl dgst -sha1

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2020-09-25
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 2019-05-10
相关资源
最近更新 更多