【问题标题】:How many times can i compose a md5 function with itself?我可以自己组合一个 md5 函数多少次?
【发布时间】:2013-09-27 18:58:48
【问题描述】:

出于研究的目的,了解我可以用自身组合多少次 md5 函数而不获得相同的值会很有用。

这是一种对盐的并行/互补方法,因为这样使用暴力破解值变得更加困难。

【问题讨论】:

  • 你的意思是while(foo != md5(foo)) { foo = md5(foo) }?虽然 md5 这些天没用了,但我怀疑它是否从根本上被破坏到 foo == md5(foo) 永远不会是真的。
  • 这在数学上是不可能的。 MD5 关系集是有限的。因此,您将返回比关系中存在的元素更多的元素。 (16^32 个值)有很多值,但这正是我的问题的重点:我能做多少次?
  • 任何其他统计/数据/研究(例如对于 sha1)都同样有用。
  • 是的,输入是无限的。但是,一旦您开始将输出作为输入反馈回来,您就会立即将自己限制为 2^128 个输入,因为这就是 md5 将输出的全部内容。生成与自身相同的输出作为输入的哈希函数是无用的。
  • 您必须考虑两件事: 1. 它有多少输入(无限)并不重要,重要的是输出是有限的。 2. 选择你想要的合成函数: md5, substr 。 md5,反向。子字符串MD5。没关系。每个组合都有一个递归限制。

标签: security hash brute-force md5sum


【解决方案1】:

看似无限。然而 MD5 已被证明不是 collision resistant 所以在某些时候你会有一个副本。

以下 Ruby 代码将循环应用 MD5 哈希算法,直到检测到重复项,此时它将打印到达重复点所需的循环数。原始字符串是由字母字符随机生成的。

require 'set'
require 'digest'

keys = Set.new

o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten
string = (0...10).map{ o[rand(o.length)] }.join
count = 0

while !keys.include?(string) do
  count += 1
  puts count
  keys << string
  string = Digest::MD5.digest(string)
end

puts "#{count}"

这将继续运行超过 1500 万个周期...一旦找到重复项,我将更新。

更新:由于我的机器资源有限,我不得不在 75,933,338 次循环后停止上述脚本而没有发生冲突(该组已分配约 8 GB 内存)

【讨论】:

  • 这似乎是一种测量它的有用方法,但可能使用磁盘上的树状数据类型。
  • 无论如何都不是证据,而是很好的轶事证据和总体上很好的答案。
  • 我只是想说明在现实世界的试验中实际制作副本是多么困难。
猜你喜欢
  • 2021-10-20
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2012-03-18
相关资源
最近更新 更多