彩虹表可以从md5值中分析出简单的明文密码吗?

时间:2014-04-25 04:16:09

标签: encryption hash md5 rainbowtable

我知道哈希值(例如:md5值)可以连接多个值,例如'^&#%we242eweqweqweqwedfdfdfee2','%$#%3423efffe435 %% ^#'

但是由于大多数用户实际上使用的是非常简单的密码,那些md5值是否只能与有限的简单明文密码建立关系?

我的意思是如果'cfcd208495d565ef66e7dff9f98764da'与30个简单值(例如'0','tom123','goodcar')连接,那么从数据库获取md5数据的黑客很容易找出用户名和它的明文密码,然后可以使用这对价值来破解其他网站上的同一帐户。

那么,任何指定的md5值是否只负责有限的简单值?

PS:我知道我可以添加盐或使用更好的方法,如sha512,sha3,但我对上面的问题非常好奇。

1 个答案:

答案 0 :(得分:2)

问题取决于您对"简单值的理解"是。一般而言,加密散列函数试图模拟任意长度输入到固定长度输出的随机映射。这些加密散列的最基本的安全概念是所谓的碰撞阻力,即,找到散列到相同固定长度输出的一对输入消息是不可行的。正如你已经证明的那样,现在用md5打破了这个概念,因为你可以构造确实在md5下碰撞的特殊消息。

但是当你在谈论"简单的价值观"我假设您排除了这些人工制作的消息,然后我们仍然可以将md5视为随机映射。

对于这种随机映射,冲突的可能性仅取决于输入域的大小。例如,如果您查看字符集{a-z,A-Z,0-9}中的所有6个字符密码,您可以确定不会发生冲突(您甚至可以自己尝试,如Chris所指出的那样)。但是如果你将这个大小扩展到同一个字符集中的25个字符,那么肯定会发生冲突,因为现在有更多可能的密码而不是可用的哈希值。

估计碰撞的可能性称为birthday problem。作为一个简单的估计,如果您有k个可能的输出值,当您达到sqrt(k)输入值时,可能会发生碰撞。因此,对于带有k=2^128的md5,如果您的输入值集接近2^64的大小,则会发生冲突。