Java 如何避免哈希搜索中的暴力搜索

Java 如何避免哈希搜索中的暴力搜索,java,dynamic,hash,brute-force,Java,Dynamic,Hash,Brute Force,我有一个java程序,它接受一个输入字符串,并使用MD5算法生成一个哈希值。该程序在每次迭代中搜索生成的哈希字符串中的特定模式(例如118855),方法是通过在输入字符串的最后部分追加一个整数来改变输入字符串的最后部分,该整数在每次迭代中递增一 例如,如果输入字符串是xyz,那么我将首先查找xyz0的哈希值,然后查找xyz1的哈希值,然后查找xyz2的哈希值,因此不使用MD5。在每个过程中,它将在每个哈希值中搜索一个模式,例如12345。在找到此模式之前,程序不会停止 现在我的问题是,如何避免在

我有一个java程序,它接受一个输入字符串,并使用MD5算法生成一个哈希值。该程序在每次迭代中搜索生成的哈希字符串中的特定模式(例如118855),方法是通过在输入字符串的最后部分追加一个整数来改变输入字符串的最后部分,该整数在每次迭代中递增一

例如,如果输入字符串是xyz,那么我将首先查找xyz0的哈希值,然后查找xyz1的哈希值,然后查找xyz2的哈希值,因此不使用MD5。在每个过程中,它将在每个哈希值中搜索一个模式,例如12345。在找到此模式之前,程序不会停止

现在我的问题是,如何避免在这些生成的哈希字符串中搜索此模式时使用暴力方法。换言之,如何将整数每次跳转一个动态值而不是一个


注意:以上所有哈希都是使用MD5生成的。我不是要求更换MD5。另外,我没有在两个哈希值中找到冲突。我关心的是在这些生成的哈希值中找到一个给定的子字符串模式。

如果可以提前告诉“xyz”字符串附加什么(而不是强制搜索),那么MD5哈希包含一个给定的模式,那么该算法就没有用了

消息摘要算法旨在使作弊几乎不可能,因此构造一个仍给出与原始文档相同哈希值的被操纵文档在计算上应该非常困难

MD5并不是可用的最强大的加密散列算法,但您肯定不能以某种方式“构造”一个纯文本来给出一些指定的MD5散列(或散列模式)。如果可能的话,人们早就扔掉了MD5

除非你是密码学大师,否则我建议你继续使用暴力方法

[编辑]

尝试查找N位数图案的次数应大致为
16^N/(33-N)
(不针对双匹配进行更正),例如,4位数图案尝试2500次,5位数图案尝试40000次。因此,根据模式长度,我认为这是可行的

[编辑]

解释“计算”:

MD5写为32个十六进制数字

因此,如果您想在散列前面找到一个特定的5位数模式,则有16^5种不同的可能性,因此一次尝试获得正确模式的概率为1/16^5,因此在成功之前大约需要16^5次尝试


但是我们不关心在散列中找到模式的位置,所以现在有28个位置我们有机会找到模式。这粗略地将匹配概率乘以28(这并不准确,因为此计算在模式包含在两个不同位置的情况下计算了两次双匹配)。因此,该因子除以预期的尝试次数。

如果可以提前告诉“xyz”字符串附加什么(而不是强制搜索),那么MD5哈希包含给定的模式,那么该算法是无用的

消息摘要算法旨在使作弊几乎不可能,因此构造一个仍给出与原始文档相同哈希值的被操纵文档在计算上应该非常困难

MD5并不是可用的最强大的加密散列算法,但您肯定不能以某种方式“构造”一个纯文本来给出一些指定的MD5散列(或散列模式)。如果可能的话,人们早就扔掉了MD5

除非你是密码学大师,否则我建议你继续使用暴力方法

[编辑]

尝试查找N位数图案的次数应大致为
16^N/(33-N)
(不针对双匹配进行更正),例如,4位数图案尝试2500次,5位数图案尝试40000次。因此,根据模式长度,我认为这是可行的

[编辑]

解释“计算”:

MD5写为32个十六进制数字

因此,如果您想在散列前面找到一个特定的5位数模式,则有16^5种不同的可能性,因此一次尝试获得正确模式的概率为1/16^5,因此在成功之前大约需要16^5次尝试


但是我们不关心在散列中找到模式的位置,所以现在有28个位置我们有机会找到模式。这粗略地将匹配概率乘以28(这并不准确,因为此计算在模式包含在两个不同位置的情况下计算了两次双匹配)。因此,该系数除以了预期的尝试次数。

存在大量加密功能强大且经验证的算法。你确定要自己动手吗?@IstvánRábel不想用我自己的算法替换MD5。我只是更新了我的问题来澄清。啊,我的错。误解了你的问题。现在更清楚了:)在这种情况下,你可以坚持使用蛮力,因为散列的要点是你无法真正找出相反的方向。需要更多信息,请参阅我对@Ralf Kleberhoff提供的答案的回答。存在大量加密强大且经验证的算法。你确定要自己动手吗?@IstvánRábel不想用我自己的算法替换MD5。我只是更新了我的问题来澄清。啊,我的错。误解了你的问题。现在更清楚了:)在这种情况下,你可以坚持使用暴力,因为散列的要点是你无法真正找出相反的方向。需要更多信息,请参阅我对@Ralf Kleberhoff提供的答案的回答。基本上,问题归结为“我正在使用的加密哈希函数是否有冲突生成器?”。如果它是一个加密合理的散列函数,答案应该总是“否”。我不是在开发一个算法来代替MD5,而是我的任务是开发一个程序,在生成的散列中找到一个特定的模式。我将用例子更新这个问题。@PiotrW