C 检查容器完整性的两种方法。哪个更好?

C 检查容器完整性的两种方法。哪个更好?,c,security,hash,data-integrity,C,Security,Hash,Data Integrity,有一个容器需要检查其完整性,然后需要对其进行分析: ------------------------------------------------------------------------------------ | Obj. count | 1_Obj.size | 1_Obj. data | ... | N_Obj. size | N_Obj. data | -----------------------------------------------

有一个容器需要检查其完整性,然后需要对其进行分析:

------------------------------------------------------------------------------------       
|   Obj. count  |  1_Obj.size |  1_Obj. data |  ...  |  N_Obj. size |  N_Obj. data |
------------------------------------------------------------------------------------
它由2N+1个元素组成,其中:
-一个通用标题(对象计数)
-N个对象。每个对象由标题(对象大小)和数据组成

为了检查完整性,我使用sha256散列检查散列容器,然后将散列与预期的散列进行比较

我看到了两种检查诚信的方法:
1.一次散列整个容器,然后将散列与预期的散列进行比较。在我们可以解析容器之后。
2.使用基于流的方法(同时检查完整性和解析):容器的每个元素都由SHA256_Update()例程分别散列。然后调用SHA256_Final()以获取最终哈希。使用这种方法需要解析容器的内部(公共头和每个对象的头)。但由于容器的头可能会被攻击者破坏,所以在完成完整性检查之前,我们无法确定所读取数据的正确性。所以看起来这种方法可能是一个安全问题

第一种方法似乎比第二种方法慢,但有点安全。 第二个看起来更快,但看起来很危险,因为我们访问了未经验证的容器内部


有人对此有何看法?是否有任何通用规则、技术或任何描述在这种特殊情况下应如何检查完整性的东西。从安全角度来看,第二种方法是否危险?如果是,我们如何论证它呢?

当你说“容器的每个元素”时,你是指散列
Obj.count
然后
1对象大小
然后
1对象数据
等等?或者你的意思是散列
1对象数据
2对象数据
,等等?(前者听起来似乎与#1相同。)就规则而言:规则通常非常简单:永远不要聪明。除了#1之外,你还想通过做其他事情来解决什么问题?(这个特定问题可能有一个标准的解决方案。)您将其标记为
c
,但不清楚这里是否存在实际的编程相关问题。它最好放在security.stackexchange.com上。@Rob Napier你好,是的,我的意思是散列容器的所有元素。第二种方法是存在的,因为它似乎应该比第一种更快。我编辑了这个问题,请检查一下。当你们说“第一种方法似乎比第二种方法工作得慢”时,不清楚你们是如何实现这一点的。如果对这两种情况下的所有字节进行散列,则它们是相同的。我怀疑他对SHA2实现(可能是制作不必要的拷贝?)的影响要大于对算法固有的任何影响。SHA-2的批处理只是通过多次更新然后执行最终计算来实现的。您是否有一些简短的代码示例来说明1和2是如何实现的?