MD5作为文件校验方法已经不可靠了,可以人为制造碰撞。
JPEG图片样本
简书会对上传的图片进行压缩,参考链接(需翻墙):
- 两张图片,相同MD5
http://natmchugh.blogspot.com/2014/10/how-i-created-two-images-with-same-md5.html - 三张图片,相同MD5
http://natmchugh.blogspot.com/2014/11/three-way-md5-collision.html
HEX样本A
d131dd02c5e6eec4693d9a0698aff95c
2fcab58712467eab4004583eb8fb7f89
55ad340609f4b30283e488832571415a
085125e8f7cdc99fd91dbdf280373c5b
d8823e3156348f5bae6dacd436c919c6
dd53e2b487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080a80d1e
c69821bcb6a8839396f9652b6ff72a70
d131dd02c5e6eec4693d9a0698aff95c
2fcab50712467eab4004583eb8fb7f89
55ad340609f4b30283e4888325f1415a
085125e8f7cdc99fd91dbd7280373c5b
d8823e3156348f5bae6dacd436c919c6
dd53e23487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080280d1e
c69821bcb6a8839396f965ab6ff72a70
两段数据的MD5均为:
79054025255fb1a26e4bc422aef54eb4
HEX样本B
4dc968ff0ee35c209572d4777b721587
d36fa7b21bdc56b74a3dc0783e7b9518
afbfa200a8284bf36e8e4b55b35f4275
93d849676da0d1555d8360fb5f07fea2
4dc968ff0ee35c209572d4777b721587
d36fa7b21bdc56b74a3dc0783e7b9518
afbfa202a8284bf36e8e4b55b35f4275
93d849676da0d1d55d8360fb5f07fea2
两段数据的MD5均为:
008ee33a9d58b51cfeb425b0959121c9
HEX样本C
0e306561559aa787d00bc6f70bbdfe34
04cf03659e704f8534c00ffb659c4c87
40cc942feb2da115a3f4155cbb860749
7386656d7d1f34a42059d78f5a8dd1ef
0e306561559aa787d00bc6f70bbdfe34
04cf03659e744f8534c00ffb659c4c87
40cc942feb2da115a3f415dcbb860749
7386656d7d1f34a42059d78f5a8dd1ef
两段数据的MD5均为:
cee9a457e790cf20d4bdaa6d69f01e41
评论
- MD5的优点是快,对于来源可靠的有限环境,MD5依然是可用的。
- 对于封闭的内部环境,加盐Hash依然是可用的,但这种“加强”是脆弱的。
- 以Wikipedia的举例,几种Hash方法的参考性能为:
MD5:335MiB/s
SHA-1:192MiB/s
SHA-256:139MiB/s
SHA-512:154MiB/s - 在公开的环境下,比如网盘、内容分发,MD5已经变得非常危险。
- 至于SHA-1,目前还没有已知的、公开的碰撞案例,但在理论上已存在风险。
- 生产工具,比如PowerShell,默认的文件Hash方法目前是SHA-256。
- Linux发行版,比如openSUSE、Fedora,其ISO文件的CHECKSUM目前是带签名SHA-256。
- 如果文件的数字签名,其摘要算法为MD5,应保持警惕。
一些参考
- 本文的样本来源
http://crypto.stackexchange.com/questions/1434/are-there-two-known-strings-which-have-the-same-md5-hash-value - 百度网盘使用MD5来“秒传”
https://www.zhihu.com/question/21275365/answer/22261983 - Nat McHugh的博客非常有意思,详细记录了制造碰撞的方法:
两个相同MD5的可执行文件
http://natmchugh.blogspot.com/2015/05/how-to-make-two-binaries-with-same-md5.html
两个相同MD5的PHP文件
http://natmchugh.blogspot.com/2014/10/how-i-made-two-php-files-with-same-md5.html