了解 SHA1-UPDATE 和 SHA1-FINAL 函数

Understanding the SHA1-UPDATE and SHA1-FINAL functions

Swift5,iOS14

试图理解别人的代码,我需要一些帮助,因为但我不确定我是否理解 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)
}
// 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 中,最终哈希中保留了内部状态,这允许 class 次称为 Length extension attacks 的攻击。但这是算法的弱点,不是设计目标。