仰望星空的天台

0%

关于散列表、散列函数和MD5加密

散列(Hash)

引用来自百度官方的定义: 通过一个(数学)函数将值从一个大的(可能很大)定义域映射到一个较小值域的过程。 而这个函数即散列函数,函数返回的值则为散列值 “好的”散列函数是把该函数应用到大的定义域中的若干值的(大)集合的结果可以均匀地(和随机地)被分布在该范围上。

什么意思呢,从数据存储的角度理解, 一份数据的定义,小到几个字符,大到庞大的数据库的全部数据( 以最小单位为单个数据库的情况) 。 而人类每天,每时每刻都在产生着很多数据。 所以,如果我们需要管理这些数据。就需要对他们添加索引,进而进行删除,修改,更新等操作

从加密的角度来说,假设你需要传输一份重要的数据给对方,但是怕传输过程中被他人修改,这时候就需要产生一个效验码,以免在传输过程中被人其他人篡改

其中有一种加密方式(MD5) 即Message Digest Algorithm 消息摘要算法 方法的本质也可以用散列来理解。将需要发送的数据(消息) 进行数据摘要 ,也就是截取一部分数据 然后通过MD5的散列函数 进行不可逆加密(这里指的加密不是对文件本身进行加密,而是产生一个数据指纹, 只要这个数据哪怕有一字节的变化,产生的加密码都不相同) 并产生同样位数的散列值(无论数据截取的大小,产生的散列值大小都相同) 然后,发送散列值给对方,对方再使用散列该散列值验证得到的文件是否是真实的。 (也可以用于电子合同,当双方均确认有效后,将MD5码存入数据库,以确保合同的有效性)

这里所谓”大的(可能很多)定义域”我们可以理解为数据。(数学)函数当然就是消息摘要的算法,将算法封装成 函数,也就是散列函数。所得到的散列值组成的较小值域即是我们所谓的散列表

碰撞

什么是碰撞呢? 如果两个不同数据散列过后产生的散列值相同,这时候我们就称之为碰撞了。

我们可以通过碰撞性这方面来看看为什么都说MD5强大了 MD5具有强碰撞性

设通过MD5算法返回128位的散列值 根据MD5算法,碰撞的概率是1/(2^128 * 2^128),这个或者说就是

1/(2^256)= 1/(1.1579208923731619542357098500869*10^77)。

这是什么概念呢? 按照每个文件1KB大 需要10^68TB 才会发生碰撞

以1000为进制 10^68TB = 10^65 PB 10^65 PB = 10^62 EB 10^62 EB = 10^59 ZB

而科学家估计即使到了2020年一年全球产生修改删除的数据量也才40ZB 假设以每年40ZB算,从冯诺依曼团队发明电子计算机那年1946开始算起 全球一共才使用了2960ZB的数据 所以MD5发生碰撞的概率几乎为零

总结一下

所谓散列和散列函数,就是通过提取一个文件中的部分数据摘要,在散列函数的作用下产生一个必定对应的散列值( 电子指纹)。

感谢

百度百科

MD5碰撞的概率 对散列表的理解

Table of Contents