我在java中有一个程序,它接受一个输入字符串并使用MD5算法生成一个哈希值。程序在每次迭代中通过改变输入字符串的最后部分来搜索生成的散列字符串中的特定模式(例如118855),方法是在每次传递中使用一个整数递增一个整数。
例如,如果输入字符串是xyz,那么我将首先找到xyz0的散列,然后是xyz1,然后是xyz2,因此不使用MD5。在每次传递中,它将在每个散列值中搜索例如12345的模式。在找到这种模式之前,程序不会停止。
现在我的问题是如何避免在这些生成的哈希字符串中搜索此模式的暴力方法。换句话说,我怎么能用动态值而不是每次一个来跳过整数?
注意:以上所有哈希都是使用MD5生成的。我不是要求更换MD5。另外,我没有在两个哈希值中找到冲突。我关心的是在这些生成的哈希值中找到给定的子字符串模式。
答案 0 :(得分:3)
如果可以事先告诉你要添加到“xyz”字符串的内容(而不是暴力搜索),那么MD5哈希包含给定的模式,那么算法就没用了。
消息摘要算法的目的是让作弊几乎不可能,因此构建一个仍然提供与原始哈希值相同的哈希值的被操纵文档应该在计算上非常困难。
MD5不是加密最强的可用散列算法,但肯定你不能以某种方式“构造”纯文本来给出一些指定的MD5散列(或散列模式)。如果可能的话,人们很久以前就扔掉了MD5。
除非你是加密大师,否则我建议你坚持使用蛮力方法。
[编辑]
找到N位数模式的尝试次数大致应为16^N / (33-N)
(未针对双重匹配进行更正),例如2500次尝试4位数模式或40000次尝试获得5位数模式。所以,根据模式长度,这对我来说是可行的。
[编辑]
解释“计算”:
MD5写成32位十六进制数字。
因此,如果你想在哈希前面找到一个特定的5位数模式,那么有16 ^ 5种不同的可能性,所以单次尝试获得正确的模式的概率是1/16 ^ 5,因此需要大约16 ^ 5次尝试,直到你成功。
但我们并不关心哈希中我们找到模式的位置,所以现在有28个位置我们有机会找到我们的模式。这大致将匹配概率乘以28(这不准确,因为该计算在两个不同位置处包含模式的情况下计算两次双匹配)。因此,该因子除了预期的尝试次数。