我想计算一组(无序列表)元素的sha1哈希值。我已经计算了每个元素的sha1哈希值。我正在考虑两个解决方案:
按其哈希值对元素进行排序,并计算此列表的顶部哈希值。
将元素哈希值视为160位整数值,并将XOR(按位运算)一起处理为一个160位哈希值。
第二种解决方案在安全散列函数属性方面是否较弱? (图像前电阻,第二图像前电阻,抗冲击性)。
答案 0 :(得分:7)
选项1是在ERS中完成的:该标准使用哈希树,其中每个节点包含通过子节点的哈希值集合计算的哈希值;由于树中的顺序不重要,因此在散列之前按字典顺序对值进行排序。这很好,据我们所知,安全。
选项2非常不安全:如果散列函数具有160位输出,那么我可以轻松生成160个随机输入,使得相应的散列值构成向量空间的基础 GF(2) 160 ,此时我可以为任何聚合哈希值生成匹配集。攻击成本可以忽略不计。
@ paj28建议的选项3(将值排序为哈希值,然后对它们进行哈希处理)也很好,只要您使用明确的分隔符“连接”排序值即可。例如,如果散列包含“bar”和“foo”的字符串集,则不希望获得与包含“ba”和“rfoo”的字符串集相同的散列值。当所有哈希值具有相同的长度时,更容易获得安全。
因此,使用选项1:对集合中的每个值进行散列,然后按字典顺序对散列值进行排序,并再次对排序的值列表进行散列。
关于选项2的攻击:这是线性代数。假设你有 n 位的 k 向量,这样它们都不等于某些 k-1 其他向量的XOR (据说它们是线性独立的)。然后考虑一个新的随机向量 v ;该向量等于某些 k 向量的XOR的概率等于 2 kn ,即只要它小就可以了 k< Ñ。如果新的向量 v 确实与你已经拥有的 k 向量线性独立(因此概率 1-2 kn ),然后将其添加到集合中:您现在有 k + 1 线性独立向量。
递归:您很快就会获得 n 位的 n 向量,它们彼此线性无关。但是你不能走得更远,因为任何新矢量线性独立于 n 之前的概率已经下降到0. n 向量被认为是向量空间的基础。
在这种情况下,通过简单地散列值来获得向量(随机值,或带有结构的值,它并不重要,因为散列函数充当随机函数)。
对于给定的 k 向量集,确定新向量 v 是否与 k 向量线性无关{{{ 3}}。相同的算法让您知道,一旦您有了基础, n 基础向量的将被异或一起产生任何向量 v' 。在这个问题的设置中,这意味着一旦我生成了 n 值 m i ,那么 h(m i )构成一个基础,然后对于任何目标 n 位输出 t ,我可以使用高斯消除来计算出我的哪个 h(m i )可以一起进行异或运算,以准确得到值 t 。相应的 m i 值是 t 的原像。
答案 1 :(得分:0)
另一个选项(3)是首先对元素进行排序,然后使用不能作为元素一部分出现的分隔符将它们组合成单个字符串。
在这些可能性中,2最让我感兴趣。我现在想不出你怎么能以实际的方式攻击它,但它似乎是最危险的。
所以1和3基本上都没问题。但我建议3,因为你按照预期的方式使用哈希。