当前位置:K88软件开发文章中心编程全书编程全书03 → 文章内容

你所不知道的:为什么应该放弃或减少使用MD5

减小字体 增大字体 作者:华军  来源:不详  发布时间:2019-1-30 16:49:23

MD5是一种常用的单向哈希算法。它被广泛用于以下几个用途:检查数据是否一致。将两地存储的数据进行哈希,比较结果,如果结果一致就无需再进行数据比对。这是利用了其“抵抗冲突”(collision- resistant)的能力,两个不同的数据,其哈希值只有很小的几率一致。相当多数据服务,尤其是网盘服务,利用类似的做法来检测重复数据,避免重复上传。存储用户密码。将密码哈希后的结果存储在数据库中,以做密码匹配。这是利用了其做为单向哈希的特点,从计算后的哈希值不能得到密码。校验数据正确性。将数据和数据哈希后的结果一并传输,用于检验传输过程中数据是否有损坏。这是利用了很难找到两个不同的数据,其哈希结果一致的特点。下面我们将说明为什么对于上面三种用途, MD5都不适用。第一个用途尤其可怕。这个用途的最大的问题是,MD5在现实中已经被发现有相当多的数据都可能导致冲突。举例而言,如下两段数据的MD5哈希值就是完全一样的。数据 14d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18af bf a2 00 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 7593 d8 49 67 6d a0 d1 55 5d 83 60 fb 5f 07 fe a2数据 24d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18af bf a2 02 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 7593 d8 49 67 6d a0 d1 d5 5d 83 60 fb 5f 07 fe a2输出相同的MD5 哈希008ee33a9d58b51cfeb425b0959121c9这意味着,如果用户提供数据 1,服务器已经存储数据 2。通过简单的MD5哈希方式检查重复,服务器上为用户保存的数据就是2。 接下来发生的事情大家都知道了,就是用户数据丢了!第二个用途很容易遭到rainbow table攻击,和明文存储密码的实质区别不大。第三个用途里一般会在需要哈希的数据中混入某些秘密,也就是计算公式为md5(secret key + data)。 但这样并不适合用于验证数据的完整性。这是因为,从理论上上来说,如果知道md5(secret key +X),即使不知道secret key的内容, 仍然可能通过对X的分析,计算得到md5(secret key +Y),从而将X成功的替换成Y,导致接收方仍然认为数据是正确的。对于比较少使用 MD5 的朋友也可以用魔方优化大师中的“文件校验”来体验一下相关 MD5 校验应用~

你所不知道的:为什么应该放弃或减少使用MD5