MD5

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范。

将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础原理。

1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

要解决的问题

有多个不同的源串经过MD5签名后结果相同的情况。但这不影响MD5的使用。MD5的作用并不是加密而是“签名”(Signature)

MD5的核心

  • 不易破解。运算不可逆,根据结果串非常难反推源串
  • 减少碰撞。签名后的结果分布比较均匀,发生重复的几率最小
  • 特别微小改动的两个数据,一定不要碰撞。Key值只有轻微变化,Value值也会发生很大地变化
  • “试探法”来破解MD5,付出的代价要特别高
  • 不考虑还原 (有别于压缩算法)

算法

MD5的容量,128-bits,

java对string的哈希,

碰撞概率

如果是两个随机的值,碰撞率大概在2的-128次方。

md5的组成为32位十六进制数字,共有16^32 = 3.4 * 10^38种可能

将26个英文字母组合成32位字符串将有 26^32 = 1.9 * 10^45 种可能,很显然用英文字母组合的32位字符串的可能性要远多于md5的可能性

https://stackoverflow.com/questions/8852668/what-is-the-clash-rate-for-md5

破解

文件校验

在文件大小、属性不变的前提下伪造一份MD5值一样的文件

现在MD5也不是很安全了,早几年的碰撞算法已经可以伪造一份第三方修改过的资料,当然代价还是颇高的

在网上可以下到一个叫fastcoll的小工具,这个工具可以轻松创建两个md5相同的文件,所以md5重复的概率是很大的,大到你随手就可以这样造出来一个。

加密

伪造一份MD5值一样的字符串

因为密码一般位数比较短,可以采用逆向法破解。

md5的设计思想

MD5是一种散列值,就好比你手中有一把砂子,面前有一排瓶子,你要把砂子放到瓶子里,如何才能既随机又均匀

其设计思想是使Key集合中的任意关键字能够尽可能均匀的变换到Value空间中,不同的Key对应不同的Value。通过建立Hash的方式我们能够得到O(1)的查找时间性能,其中关键在于选取一个hash function(md5就是一致hash function)。

md5这种hash函数通常情况下,Key值只有轻微变化,Value值也会发生很大地变化。 LSH正好相反,

参考