【问题标题】:How I avoid brute force searching in hash search我如何避免在哈希搜索中进行蛮力搜索
【发布时间】:2017-11-16 09:41:54
【问题描述】:

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

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

现在我的问题是如何避免在这些生成的哈希字符串中搜索这种模式时使用蛮力方法。换句话说,我怎样才能将整数跳跃一个动态值而不是每次一个?

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

【问题讨论】:

  • 存在许多强大且经过验证的加密算法。确定要自己动手吗?
  • @IstvánRábel 不想用我自己的算法来替换 MD5。我刚刚更新了我的问题以使其清楚。
  • 啊,我的错。误解了你的问题。现在更清楚了 :) 在这种情况下,您可能会坚持使用蛮力,因为散列的重点是您无法真正找出相反的方向。
  • 需要更多信息,请参阅我对@Ralf Kleberhoff 提供的答案的评论。

标签: java dynamic hash brute-force


【解决方案1】:

如果可以提前告诉“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(这不准确,因为该计算将双重匹配计算为两次,其中模式包含在两个不同的位置)。因此,该因子除以预期的尝试次数。

【讨论】:

  • 这个。基本上,问题归结为“我正在使用的加密哈希函数是否存在冲突生成器?”。如果它是一个加密健全的哈希函数,答案应该始终是“否”。
  • 我不是在开发一种算法来代替 MD5,而是我的任务是开发一个程序来在生成的哈希中找到一个特定的模式。我将用示例更新问题。
  • @PiotrWilkin 我没有找到碰撞生成器。我刚刚在哈希值中找到了一个子字符串。
  • 如何得到 16^N / (33-N)?
  • md5 is 坏了。最迟从 2010 年开始,不应再使用它。但即使在此之前,也不建议使用它。
猜你喜欢
  • 2014-02-23
  • 2021-06-07
  • 2013-10-22
  • 1970-01-01
  • 2011-07-16
  • 2021-01-08
  • 2015-07-20
  • 2020-01-30
相关资源
最近更新 更多