在给定N位数字输入和碰撞相关目标的情况下设计最大散列大小

时间:2013-08-07 18:49:44

标签: hash size probability collision uncertainty

假设黑客获取存储的哈希,盐,胡椒和算法的数据集,并且可以访问无限的计算资源。我希望确定最大散列大小,以便确定原始输入字符串的确定性在名义上等于某个目标确定性百分比。

约束:

  

输入字符串仅限于8个数字字符   均匀分布。没有诸如a之类的数字间关系   校验和数字。

     

目标名义确定性百分比为1%。

     

假设散列函数是一致的。

以字节为单位的最大散列大小是多少,因此名义上有100个(即1%确定性)8位数值将计算到相同的散列值?应该可以从接受的答案推广到N个数字和X%。

请说明使用标准20字节SHA1的前N个字节作为可接受的实现是否存在任何问题。

人们认识到这种方法会通过增加可能的“正确”答案来大大增加对暴力攻击的敏感度,因此需要进行设计权衡,并且可能需要一些额外的措施(时间延迟) ,多个验证阶段等)。

1 个答案:

答案 0 :(得分:0)

看起来你想要确保碰撞,并认为如果一个黑客获得了所有东西,以至于它假设它们可以强制所有散列值,那么它们不会以原始值结束,而只是一组每个散列值的可能原始值。

您可以通过在正常的加密散列之前执行前导步骤来实现此目的。此前导步骤只是将您的可能值集折叠为一组较小的可能值。这可以通过各种手段来实现。基本上,您在输入值上应用了初始hash function。使用如下所述的模运算是一种简单的散列函数。但是可以使用其他类型的哈希函数。

如果您有8位数的原始字符串,则有100,000,000个可能的值:00000000 - 99999999.要确保100个原始值散列到同一个值,您只需将它们映射到1,000,000个值的空间。最简单的方法是将字符串转换为整数,执行模数1,000,000操作并转换回字符串。完成后,以下值将散列到同一个存储桶: 00000000,01000000,02000000,....

问题在于黑客不仅知道散列值可能是100个值,而且他们肯定知道8个数字中的6个是什么。如果被散列的实际值中的数字的实际可变性在所有位置上都不一致,那么黑客可以使用它来绕过你想要做的事情。

因此,最好选择模数值,以便对映射到相同散列值的值集中的每个字符位置均匀地表示整个数字范围。

如果原始字符串的不同区域比其他区域具有更大的可变性,那么您可能希望对其进行调整,因为无论如何静态区域更容易猜测。黑客想要的部分是他们无法猜测的高度可变的部分。通过将8位数分成区域,您可以在每个区域单独执行此预哈希,并选择模数值以改变每个区域的碰撞程度。

作为一个例子,你可以打破8位数,因此000-000-00。 prehash会将每个区域转换为单独的值,对每个区域执行模数,将它们连接回8位数字符串,然后对其进行正常散列。在这个例子中,给定输入“12345678”,你会得到123%139,456%149和78%47,它们产生123 009 31.这个预哈希有139 * 149 * 47 = 973,417个可能的结果。因此,将有大约103个原始值将映射到每个输出值。为了了解这最终如何工作,第一个区域中的以下3位原始值将映射到相同的值000:000,139,278,417,556,695,834,973。我做了这个以动态为例,所以我并没有特别推荐这些区域和模数值的选择。

如果黑客得到了所有东西,包括源代码,而暴力强迫所有人,他最终会得到预哈希产生的值。因此,对于任何特定的散列值,他会知道它是大约100个可能的值之一。他会知道所有这些可能的值,但他不知道哪一个是产生散列值的原始值。

在走这条路之前你应该好好思考。我对任何与标准的,可接受的加密建议不同的东西都很谨慎。