【问题标题】:Empty string hash and null char hash are not same?空字符串哈希和空字符哈希不一样?
【发布时间】:2021-12-23 01:17:38
【问题描述】:

我正在使用 hashlib sha256 (python) 来证明两个输入。

我的假设是空字符,空字符串会给出相同的哈希值。

这是我的代码

from hashlib import sha256
print(sha256(b'\x00').hexdigest(),end='\n\n')
print(sha256(b'').hexdigest())

它给出了输出

6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

为什么他们没有给出相同的结果?

字符串总是以null结尾的C语言字符串格式有关系吗? 所以当我散列null时,它会散列双null?

【问题讨论】:

  • 你的假设是错误的。空字符串的长度为 0。零字节的长度为 1。在 SHA 中填充和添加长度可防止它创建相同的结果。它与C字符串无关,因为你这里有二进制数据。
  • I call it my billion-dollar mistake, Tony Hoare。您混淆了空字符串和空字符串。 Null 表示指针的地址为 0,空字符串表示字符串中没有任何内容 - 长度为 0。 NIST 甚至发布了零长度示例代码in test vectors
  • @kelalaka 一​​个包含一个值为零的单个字节的 Python 字符串与地址为 0 的指针无关。它只是编码一个长度为 1 的字节数组,其中包含一个零字节。
  • @Morrolan 好吧,我主要讨论的是常见的误解。这就是重点,为什么值为 0 的字符串应该为空!

标签: hash


【解决方案1】:

一个空字符串是(或者,严格来说,“编码为”)一个长度为零的字节数组,不包含字节。您可以观察这一点,例如如下,使用Python:

>>> list(bytes("", 'ascii'))
[]

另一方面,由单个零字节组成的字符串是长度为 1 的字节数组,包含值为零的单个字节:

>>> list(bytes("\x00", 'ascii'))
[0]

因此这两个输入是不同的,并且会散列到不同的值。

正如上面 cmets 中提到的,与某些语言(例如 C)如何表示字符串无关,使用零字节表示它们的结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 2011-08-18
    • 2019-08-08
    • 2016-08-29
    • 1970-01-01
    • 2013-12-19
    • 2012-08-23
    • 2019-07-29
    相关资源
    最近更新 更多