【问题标题】:Python hashlib SHA256 with starting value具有起始值的 Python hashlib SHA256
【发布时间】:2021-03-29 20:49:45
【问题描述】:

我想为大学任务处理 HMAC* 长度扩展攻击。 因此,我同时提供了一个 HMAC* 和相应的消息,并且想要附加另一个任意消息并在没有密钥的情况下重新计算 HMAC。 关于我们的讲座,这是可能的,也是非常常见的攻击场景。

我的问题是基于实现: 为了推动这种攻击,我需要用我已经拥有的现有 HMAC* 替换默认的 SHA256 起始值(h0 到 h7)。由于我没有钥匙,所以无法直接推入原始数据。

除了重新实现 SHA256 之外,还有其他方法可以让我在 python3 中替换这些起始值吗?

澄清

我有一个有效的 HMAC* h。 此外,还有一条消息 m 已被用于(连同密钥 k)来生成 h。 (h = SHA256(k || m))。

我的任务:我需要在 m 的基础上,在不知道 k 的情况下,找到一种方法来推导另一个 HMAC* h'。事实证明,新消息是 m' = m + pad(k||m) + a 和随机选择的 a

进一步说明

*:对于“HMAC”,我不是指 RFC 2014 的标准。HMAC 通常“是一种特定类型的消息认证代码 (MAC),涉及加密散列函数和秘密加密密钥。” (维基百科.org/HMAC)。 在这种情况下,HMAC 计算为 h = SHA256(k || m) 其中 k 是密钥,|| 是连接和 m 是消息。

【问题讨论】:

  • 那会是什么 HMAC 长度扩展攻击? HMAC 的“存在​​理由”是to avoid length extension attacks。除此之外,是什么让您认为需要更改起始值才能执行长度扩展攻击?
  • 一般 API 不会提供这种功能,但您始终可以复制源代码并进行更改。
  • 我终于通过移植一个 C 实现得到了它。其他方式可能会减少工作量,但通过这种方式,我了解到 SHA256 的工作原理非常好。我会尽快澄清问题中的问题。

标签: python-3.x cryptography sha256 hmac hashlib


【解决方案1】:

首先,SHA256 上下文包含多个参数。在这个解决方案中,其中两个是相关的: 以某种方式代表 SHA256 算法“进度”的状态。最终状态实际上是 SHA256 哈希和。而 seconds 参数是以比特为单位的总消息长度,将在填充结束时设置。

此外,SHA256 总是使用填充什么意思,另一个字节序列 p 在计算最终哈希之前隐式添加到输入数据中,并取决于实际输入值。因此,假设 mySHA256 没有使用填充,假设 SHA256(x) = mySHA256(x || p(x))

当使用 h = SHA256(k || m) = mySHA256(k || m || p) 生成给定的 HMAC h 时, k 是密钥,m 是消息,h 代表 SHA256 上下文的最终状态。此外,我们有一个隐式填充 p,它依赖于 k ||米。因此,p 不依赖于 len(k) 而不是 k 本身,这意味着我们可以计算 p em> 不知道密钥但它的长度。

当我提供正确的 HMAC h' = SHA256(k || m') 时,我的目标只会接受我修改后的消息 m' = m + a,我现在需要专注于这一点。通过知道原始HMAC h,我可以设置h对应的SHA256上下文的状态。我也知道消息 m,并且我知道消息的总长度(以位为单位)是 (len(k) + len(m) + len(p)) * 8 em>,我的整体消息长度仅取决于 len(k)(不是 k!)因为 len(p) 仅取决于 len(k) em>len(k)len(m)。我将遍历 len(k) 的范围,例如 1 - 64。在每个迭代步骤中,我只需插入 len(k) 的值。因此也可以设置整体消息长度(我的 SHA256 上下文的第二个参数)。

在遍历所有key长度时,会有一个值代表实际使用过的key的长度。在这种情况下,我有一个 SHA256 上下文,它与原始计算的上下文完全相同。我们现在可以将我们的任意数据 a 添加到哈希计算中,并创建另一个 HMAC h',它确实依赖于密钥 k 而不知道它。 h' = SHA256(k || m || p || a)

但是现在,我们必须确保这个 HMAC h' 等于那个,目标使用我们的消息 m' 进行计算。 因此,我们将填充 p 添加到原始消息 m 的末尾,然后是我们的任意消息 a。最后我们有 m' = m || p ||一个

由于目标知道密钥以验证输入数据,它可以轻松计算 SHA256(k || m') = SHA256(k || m || p || a )* 和哎呀!实际上,这与我们在不知道密钥 k

的情况下计算的 HMAC h' 的哈希值相同

结果: 我们不能添加完全任意的消息,而是在填充之后 完全任意的消息。由于填充大部分都是空字节,这可能会干扰我们的攻击,但这取决于每种情况。在我的例子中,Null-Bytes 被忽略了,我在插入的消息之前只显示了整个消息长度中的一个工件。

【讨论】:

  • 你所说的 HMAC 可能是键控散列,但 HMAC 是使用散列的特定方案。因此,并非所有键控散列方案都应称为 HMAC。它被称为 SHA-256,而不是 SHA256;最好保持标准化名称,否则这类误解会不断发生。
  • 好吧,我不同意你的所有观点。首先,HMAC 是“一种特定类型的消息认证码 (MAC),涉及加密散列函数和秘密加密密钥”(en.wikipedia.org,HMAC)。因此,HMAC 不是一个特定的方案,但 RFC 2104 是。不过我没有提到我不参考这个标准,这对共识没有帮助。关于 SHA(-)256 的事情:如果缺少减号导致误解,我认为问题出在读者方面。
猜你喜欢
  • 2019-03-26
  • 2019-03-08
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多