0

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

约束:

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

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

假设散列函数是统一的。

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

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

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

4

1 回答 1

0

看来你想确保冲突,如果黑客获得了一切,假设他们可以暴力破解所有散列值,那么他们最终不会得到原始值,而只会得到一组可能的原始值对于每个散列值。

您可以通过在正常加密散列之前执行前导步骤来实现这一点。此前导步骤只是将您的一组可能值折叠为一组较小的可能值。这可以通过多种方式来实现。基本上,您正在对输入值应用初始哈希函数。使用如下所述的模算术是哈希函数的一种简单变体。但是可以使用其他类型的散列函数。

如果您有 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 个可能值之一。他会知道所有这些可能的值,但他不知道其中哪一个是产生散列值的原始值。

在走这条路之前,你应该三思而后行。我对任何背离标准的、公认的密码学建议的东西都持谨慎态度。

于 2013-08-08T00:18:34.560 回答