其实MD5有没有碰撞是一个很简单的问题,稍微有点数学知识的人都应该可以想到,但是却常常为了这个问题被别人嗤之以鼻。看来主要原因可能是因为我不是名人,计算机水平太有限,在一个个所谓的大仙面前当然是不能服众了。但很遗憾,这的的确确是一个数学问题。
MD5的算法我是不清楚的,但是通过排列组合来看就可以知道它的结果会不会有碰撞了。举一个最简单的例子。MD5的加密结果是一个32位的16进制数,那么组成这个字符创的字符就只能为[0-9a-f]16个字符,从这一点上来看MD5的加密结果多可能性就是16^32(16的32次方)。
那个一个普通字符串的可能性呢,现在我们就只考虑这个字符串是由字母和数字构成的[a-z0-9],那么一位长度的字符的可能性:36^1
长度为2的:36^2
长度为3的:36^3
长度为4的:36^4
长度为5的:36^5
长度为6的:36^6
长度为7的:36^7
以此类推,长度小于等于32的字符串的可能性为36^1+36^2+36^3+....+36^32,相对于这个来说,MD5的加密结果是一个很有限的数量。仅就一个小于32位的字符创来说碰撞就是不可以避免的,那么对于长字符串MD5又岂能完全胜任,所以个人觉得MD5用到密码保护上还是可以的,但是要MD5的结果作为一个唯一标识,还是存在很大的隐患的。



#1
