Hash 如何计算一组(无序列表)值的散列?

Hash 如何计算一组(无序列表)值的散列?,hash,Hash,我想计算元素集(无序列表)的sha1散列。我已经计算了每个元素的sha1散列。我正在考虑两种解决方案: 按元素的散列对元素进行排序,并计算此类列表的顶部散列 将元素散列视为160位整数值,并将其XOR(按位操作)合并为一个160位散列 第二种解决方案是否在安全哈希函数属性方面较弱?(预映像阻力、第二预映像阻力、碰撞阻力)。另一个选项(3)是首先对元素进行排序,然后使用不能作为元素一部分出现的分隔符将它们组合成单个字符串 在这些可能性中,我最关心的是2个。我现在想不出你怎么能用一种实际的方式来攻击

我想计算元素集(无序列表)的sha1散列。我已经计算了每个元素的sha1散列。我正在考虑两种解决方案:

  • 按元素的散列对元素进行排序,并计算此类列表的顶部散列

  • 将元素散列视为160位整数值,并将其XOR(按位操作)合并为一个160位散列

  • 第二种解决方案是否在安全哈希函数属性方面较弱?(预映像阻力、第二预映像阻力、碰撞阻力)。

    另一个选项(3)是首先对元素进行排序,然后使用不能作为元素一部分出现的分隔符将它们组合成单个字符串

    在这些可能性中,我最关心的是2个。我现在想不出你怎么能用一种实际的方式来攻击它,但它似乎是最危险的


    所以1和3基本上是好的。但是我建议使用3,因为您是按照预期的方式使用散列。

    选项1是在中完成的:该标准使用散列树,其中每个节点包含一个通过子节点的散列值集计算的散列值;由于顺序在树中不重要,因此在散列之前会按字典顺序对值进行排序。这很好,而且据我们所知,是安全的

    选项2非常不安全:如果散列函数有160位输出,那么我可以轻松地生成160个随机输入,这样相应的散列值构成向量空间GF(2)160的基础,在这一点上,我可以为任何聚合散列值生成匹配集。攻击成本可以忽略不计

    @paj28建议的选项3(将值排序为散列,然后对其进行散列)也可以,只要您使用明确的分隔符“连接”已排序的值。例如,如果对包含“bar”和“foo”的字符串集进行散列,则不希望获得与包含“ba”和“rfoo”的字符串集相同的散列值。当所有要散列的值具有相同的长度时,更容易获得安全的内容

    因此,使用选项1:对集合中的每个值进行散列,然后按字典顺序对散列值进行排序,然后再次对排序后的值列表进行散列


    对选项2的攻击:这是线性代数。假设有n个位的k个向量,这样它们中没有一个等于其他k-1个向量的XOR(它们被称为是线性独立的)。然后考虑一个新的随机向量V;该向量等于某些k向量的异或的概率等于2k-n,即只要k 递归:您将很快获得n位的n个向量,这些向量彼此线性独立。但你们不能再进一步了,因为任何新向量与n个先前向量线性无关的概率已经降到了0。n个向量被称为向量空间的基础

    在这种情况下,向量是通过简单地散列值(随机值或具有结构的值,这无关紧要,因为散列函数充当随机化器)获得的


    对于给定的一组k向量,确定新向量v是否与k向量线性无关很容易。同样的算法让你知道,一旦你有了一个基,你的n个基向量中的哪一个应该被XOR在一起,以产生任何向量v'。在这个问题的设置中,这意味着一旦我产生了n个值mi,使得h(mi)构成了一个基础,那么对于任何目标n位输出t,我可以使用高斯消去法来计算出我的h(mi)中的哪一个可以异或在一起,以精确地产生值t。相应的mi值是t的前映像集。

    我不太理解您描述的针对选项2的攻击;你能再解释一下吗?我补充了一些解释。我明白了。。。非常聪明!我最初以为这样的攻击需要2^160的计算能力,但高斯消去法避免了这一点。