【问题标题】:SHA256 of visually similar strings differs in Bash vs Python在 Bash 和 Python 中,视觉上相似的字符串的 SHA256 不同
【发布时间】:2019-02-17 04:32:58
【问题描述】:

我正在尝试根据 Bash 中 https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html 的文档构建一个 AWS Signature v4 Auth 标头以调用 STS GetCallerIdentity API。

现在,我在 Python 中也有同样的过程,在仔细研究了我的脚本和 Python 和 Bash 的输出之后,我发现在 Bash 中为字符串计算的 SHA256 与在 Python 中计算的不同。

p>

字符串在我的文本编辑器中看起来相同 - 逐个字符。

但由于 SHA256 不同,我假设这是字符串编码的问题。

Python 脚本使用 UTF8,即使我尝试在 Bash 脚本中使用printf "%s" "${string}" | iconv -t utf-8 | openssl dgst -sha256,哈希值仍然不同。

如何在计算 SHA256 总和之前将 bash 字符串/变量转换为 UTF8。

【问题讨论】:

  • 十六进制转储两种情况下的输入并找出它们的不同之处
  • 将您的 Python 代码添加到您的问题中。
  • 所以我现在知道了这个问题@thatotherguy,谢谢你的建议。 \n 在 Python 中被正确解释为 0x0A,但在 bash hexdump 输出中显示为 5C6Eprintf "%s" "${string}" 不处理吗?
  • 我觉得自称是工程师而没有考虑自己转储字节串,我感到很惭愧。我不敢相信我在这上面浪费了这么多时间。 :'( 如果您将评论添加为答案,我会接受。

标签: python bash utf-8 ascii aws-sts


【解决方案1】:

了解您如何在 Python 中计算它可能会有所帮助。从我所见,看起来输出是一样的。

$ python -c "import hashlib; \
print(hashlib.sha256('test'.encode('utf8')).digest().hex())"
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

$ printf "%s" test | openssl dgst -sha256
(stdin)= 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

【讨论】:

  • 我使用了print(hashlib.sha256('test'.encode('utf8')).hexdigest())" bash 是完全一样的,只是没有我在两者之间调用iconv
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多