【问题标题】:Understanding the SHA1-UPDATE and SHA1-FINAL functions了解 SHA1-UPDATE 和 SHA1-FINAL 函数
【发布时间】:2021-01-12 02:25:43
【问题描述】:

Swift 5、iOS 14

试图理解其他人的代码我需要一些帮助,因为但我不确定我是否清楚地理解了 SHA1_UPDATE SHA1_FINAL 函数。

这是在做什么——

private func computeHash() -> Data {
 let identifierData = getDeviceIdentifier()
 var ctx = SHA_CTX()
 SHA1_Init(&ctx)

// 它创建标识符字节的 sha-1 哈希并将它们放入 &CTX 内存中

 let identifierBytes: [UInt8] = .init(identifierData)
 SHA1_Update(&ctx, identifierBytes, identifierData.count)

// 然后它创建 opaqueBytes 的 sha-1 哈希,然后将它们添加到? &CTX 内存?

 let opaqueBytes: [UInt8] = .init(opaqueData!)
 SHA1_Update(&ctx, opaqueBytes, opaqueData!.count)

// 再次执行此操作,创建 bundleBytes 的 sha-1 哈希,然后将它们添加到 &CTX 内存中

 let bundleBytes: [UInt8] = .init(bundleIdData!)
 SHA1_Update(&ctx, bundleBytes, bundleIdData!.count)

// 然后用数据再创建一个?

  var hash: [UInt8] = .init(repeating: 0, count: 20)
  SHA1_Final(&hash, &ctx)
  return Data(bytes: hash, count: 20)
}

【问题讨论】:

    标签: swift openssl sha1


    【解决方案1】:
    // it creates a sha-1 hash of identifier bytes and puts them into &CTX memory
    

    这就是你出错的地方。它不会创建字节的 SHA-1 哈希。它正在使用数据更新 SHA 上下文(状态)。尚未计算最终哈希值。

    SHA1_Final(&hash, &ctx)
    

    此时,哈希是根据当前的 SHA 上下文计算的,它会累积所有数据。

    确实,在 SHA-1 中,最终哈希中保留了内部状态,这允许称为Length extension attacks 的一类攻击。但这是算法的弱点,不是设计目标。

    【讨论】:

    • 好的,但是我想用 openssl 重现这个,我可以用这个做一个 sha-1 吗? openssl dgst -sha1 -hex 但这与最终的 SHA-1 有什么关系
    • 对不起,您说它只是将字节复制到 &CTX 内存位置,然后当所有这些字节都在最后计算哈希?
    • 不,不是复制。根据这些字节更新上下文。当您调用 FINAL 时,还会添加额外的填充。所有 SHA 算法都适用于固定大小的块。
    • 我不明白有关 openssl 的问题。命令行 openssl 没有执行部分哈希的模式(C API 有,但命令行没有)。您需要收集所有数据并将其散列在一起。
    • 没有。如果确实如此,那么您调用更新的次数将很重要。更新函数的重点是您可以使用任意长度的数据调用它。您的示例代码恰好使用某些较大数据结构的各个组件进行更新,但一个非常常见的用法是使用从文件或网络读取的统一块定期调用更新。基本点是你可以用 10 个字节调用 update 100 次,或者用 1000 个字节调用一次,它会给你完全相同的答案。
    猜你喜欢
    • 2011-11-30
    • 2014-09-25
    • 2018-03-10
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2013-01-15
    相关资源
    最近更新 更多