Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 了解SHA1-UPDATE和SHA1-FINAL函数_Swift_Openssl_Sha1 - Fatal编程技术网

Swift 了解SHA1-UPDATE和SHA1-FINAL函数

Swift 了解SHA1-UPDATE和SHA1-FINAL函数,swift,openssl,sha1,Swift,Openssl,Sha1,Swift 5,iOS 14 试图理解其他人的代码,我需要一些帮助,因为我不确定我是否清楚地理解SHA1_UPDATE SHA1_FINAL函数 这是在做什么-- //它创建标识符字节的sha-1散列,并将它们放入&CTX内存中 let identifierBytes: [UInt8] = .init(identifierData) SHA1_Update(&ctx, identifierBytes, identifierData.count) let bundleBytes:

Swift 5,iOS 14

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

这是在做什么--

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

 let identifierBytes: [UInt8] = .init(identifierData)
 SHA1_Update(&ctx, identifierBytes, identifierData.count)
 let bundleBytes: [UInt8] = .init(bundleIdData!)
 SHA1_Update(&ctx, bundleBytes, bundleIdData!.count)
//然后它创建opaqueBytes的sha-1散列,然后将它们添加到&CTX内存

 let opaqueBytes: [UInt8] = .init(opaqueData!)
 SHA1_Update(&ctx, opaqueBytes, opaqueData!.count)
//再次执行此操作,创建bundleBytes的sha-1哈希,然后将它们添加到&CTX内存中

 let identifierBytes: [UInt8] = .init(identifierData)
 SHA1_Update(&ctx, identifierBytes, identifierData.count)
 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)
}
这就是你错的地方。它不会创建字节的SHA-1散列。它正在用数据更新SHA上下文(状态)。尚未计算最终哈希

SHA1_Final(&hash, &ctx)
此时,将根据当前SHA上下文计算哈希值,该上下文将累加所有数据


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

好的,但我想用openssl重现这一点,我可以用这个做sha-1吗?openssl dgst-sha1-hex但是这与最终的SHA-1有什么关系呢?你说它只是简单地将字节复制到&CTX内存位置,然后当它让所有字节都在最后计算哈希值时?不,不是复制。基于这些字节更新上下文。当您调用FINAL时,还会添加额外的填充。所有的SHA算法都在固定大小的块上工作。我不理解openssl的问题。命令行openssl没有执行部分哈希的模式(C API有,但命令行没有)。您需要收集所有数据并将其散列在一起。否。如果它这样做了,那么你调用update的次数就很重要了。update函数的全部要点是,您可以使用任意长度的数据调用它。您的示例代码恰好调用一些较大数据结构的单个组件进行更新,但一个非常常见的用法是使用从文件或网络读取的统一块定期调用update。基本要点是,您可以使用10个字节调用update 100次,或者使用1000个字节调用update一次,它将给出完全相同的答案。