鉴于哈希算法,除了暴力之外,还有一种更有效的“unhash”方法吗?

时间:2011-04-24 00:51:03

标签: security hash encryption

所以我有一个散列函数的代码,从它的外观来看,没有办法简单地取消它(很多按位AND,OR,移位等)。我的问题是,如果我需要在散列之前找出原始值,是否有一种更有效的方法,而不仅仅是强制一组可能的值?

谢谢!

编辑:我应该补充一点,就我而言,原始邮件永远不会超过几个字符,为了我的目的。

EDIT2:出于好奇,有没有办法在没有预先计算的表格的情况下执行此操作?

4 个答案:

答案 0 :(得分:3)

是; 彩虹表攻击。对于较短字符串的哈希尤其如此。即,'true''false''等小字符串的哈希值可以存储在字典中,并可以用作比较表。这大大加快了裂解过程。此外,如果散列大小很短(即MD5),则算法变得特别容易破解。当然,解决这个问题的方法是在加密之前将“加密盐”与密码结合起来。

关于此事,有两个非常好的信息来源:编码恐怖:Rainbow Hash Cracking和 维基百科:Rainbow table

编辑:Rainbox表可以达到数十GB,因此下载(或复制)它们可能需要数周才能进行简单的测试。相反,似乎有一些用于反转简单哈希的在线工具:http://www.onlinehashcrack.com/(即尝试反转463C8A7593A8A79078CB5C119424E62A,这是“破解”一词的MD5哈希值)

答案 1 :(得分:2)

“Unhashing”被称为“preimage attack”:给定哈希输出,找到相应的输入。

如果哈希函数是“安全的”,那么在找到命中之前没有比尝试可能的输入更好的攻击;对于具有 n -bit输出的散列函数,散列函数调用的平均数量约为 2 n ,即Way Too Much for当 n 大于180左右时,当前基于地球的技术。换句话说:如果找到比这个强力方法更快的攻击方法,对于给定的散列函数,则哈希函数被视为无可挽回地破坏。

MD5 被视为已损坏,但是对于其他弱点( 已发布的成像 2 123.4 em>,因此比蛮力成本快24倍 - 但它仍然在技术上不可行,以至于无法确认。)

当已知散列函数输入是相对较小空间的一部分时(例如,它是“密码”,因此它可以适合人类用户的大脑),那么可以通过使用预先计算的表来优化前映像攻击:攻击者仍然需要支付一次搜索费用,但他可以重复使用他的表来攻击多个实例。彩虹表是预先计算的表,具有节省空间的压缩表示:使用彩虹表,攻击者的瓶颈是CPU能力,而不是他的硬盘大小。

答案 2 :(得分:1)

假设“正常情况”,原始消息将比散列长许多倍。因此,原则上绝对不可能从散列中导出消息,因为您无法计算不存在的信息。

但是,你可以猜出什么是正确的消息,并且存在加速常见消息(例如密码)的过程的技术,例如彩虹表。如果哈希匹配,那么看起来合理的东西很可能是正确的消息。

最后,只要找到一个可以通过的信息,就没有必要找到好的信息。这是对MD5的已知攻击的主题。此攻击允许您创建一个不同的消息,该消息提供相同的哈希值 这是否是安全问题取决于您使用哈希的具体内容。

答案 3 :(得分:1)

这可能听起来很简单,但是如果你有哈希函数的代码,你总是可以覆盖哈希表容器类的hash()函数(或类似的,具体取决于你的编程语言和环境)。这样,您可以散列3个字符或更少的字符串,然后您可以将散列存储为获取原始字符串的键,这看起来正是您想要的。我想,使用这种方法构建自己的彩虹表。如果您有要在其中找到这些值的程序环境的代码,您可以随时修改它以在哈希表中存储哈希。