分享

MD5哈希算法不可逆,但是网上有很多破译解密哈希密钥的网站,这些都是经过大数据堆积的吗?还是可以破解?

 半佛肉夹馍 2023-10-20 发布于河南

鉴于胡扯八道信口开河的太多,这里必须先强调一点:王小云院士并没有破解MD5,她只是否定了MD5的抗碰撞可靠性

抗碰撞可靠性说的是,对一个给定的文件/资料,我们可以算出一个MD5;那么将来这个文件/资料将来就无法篡改一丝一毫,否则算出来的MD5马上就不一样了。这就是所谓的“数字签名”。

重复一遍:数字签名的作用是确保文件内容未经篡改

而王小云的工作是,她可以看着明文M1,找到另一个明文M2,使得MD5(M1)=MD5(M2)。

注意这个工作必须建立在已知明文M1的基础上

这东西有什么用呢?

比如,我可以写一个程序。随便你怎么测试,这个程序都是良性的,不会造成任何破坏。

但实际上,这个程序里有一个判断,这个判断是检查一个字符串A1是否等于A1;若等于,就好好表现,一点坏事都不做;等你测试完了、给了MD5签名,打包票说这个程序是个好程序——现在,我可以把程序里的A1替换成另一个MD5值相同的不同字符串A2;程序再检查时,自然会发现字符串A2不等于A1,它就开始做坏事了。

#define A1 "hello, world!"
//给人检测时A2和A1相同,准备破坏时可以把A2改成"#$*^*&^*!",假设后者和A1的MD5相同
#define A2 "hello, world!"

int main(int argc, char* argv[]) {
if(strcmp(A1, A2) == 0) {
printf("hello world."); //乖乖输出hello world
} else {
exec("format C:"); //虽然MD5相同,但A2修改后却会格式化硬盘
}

return 0;
}

这是个很钻牛角尖的玩法,很难想象这么做能得到什么好处。尤其成熟的检测会查你的符号表,看你有没有调用敏感接口。

但它能够成立,就证明了程序签名可能是不可靠的。

虽然我们很难定向把合同金额改大/改小,甚至很难保证金额A1改成MD5相同的A2后还是合法字符——换句话说就是很难应用到现实中——但有了她发现的突破口,现在寻找碰撞串已经越来越容易了。那么这种攻击迟早就会到来。

因此,在王小云成功完成碰撞攻击后,MD5仍然使用了好些年。原因就在于她完成的仅仅是碰撞攻击,并没有真正破解MD5。

为什么近些年来MD5逐渐废止了呢?

因为针对MD5的攻击已经变得可行、甚至已经发生。比如通过碰撞、制造能够通过签名算法认证的恶意程序——如果你验证它的MD5/CA证书,你会发现它的证书有效;但装上去却是个恶意程序。原理就是通过碰撞,找到了不同前缀但MD5相同的字符串,从而可以让恶意软件可以和正常软件共享证书。

因此,业界普遍承认MD5已经不够可靠,因此需要提前迁移到更安全的方案,不能等损失出现再开始动作。

换句话说,如果要求不高的话,你完全可以在不需要碰撞安全的场景继续使用MD5,暂时还没人能攻击你;只不过几年甚至几个月后,学界再有一些突破,你可能就会倒霉。

所谓“已知MD5值,另外找一个字符串M,使其MD5值等于给定MD5”,那纯粹是一知半解者的胡扯八道

真有那么神,王小云碰撞攻击成功当天,全世界就要沸腾起来并忙不迭的废除MD5了,哪可能拖延几年。

这是因为,虽然外行看起来差不多,但在内行眼里,“已知MD5值找碰撞”完全是另外一回事

它威胁的不是“防篡改”这个狭窄的领域而是“鉴权认证”这个应用更为广泛、后果极其严重、处理起来刻不容缓的要害

换句话说,“鉴权认证”依赖的就是“不可能根据已知的MD5值,找到一个字符串M2,使得MD5(M2)等于用户密码M1的MD5,即MD5(M2)=MD5(M1)”。如果这个基础都没有了,MD5保护下的一切就完蛋了。可以说多耽误一分钟,世界各国银行里的数万亿美元资产不翼而飞的几率就增加一大截——怎么可能犹犹豫豫拖延几年,这才“提倡逐渐废止MD5”。


以下是原文:

MD5算法不可逆,意思是不可能通过数字摘要还原原始文本;但只要原始文本一致,MD5算出的值是固定不变的。

比如,MD5(123456)=e10adc3949ba59abbe56e057f20f883e,我们的确没有办法从e10adc3949ba59abbe56e057f20f883e推导出明文是123456;但只要密码是123456,那么它算出的MD5就一定是e10adc3949ba59abbe56e057f20f883e。

人是有惰性的。因此诸如123456、12345678、asdf1234之类“简单密码”总是被很多人选用——无他,好记。

那么,如果我们先把这类简单密码的MD5算出来,是不是哪个傻子再用123456做密码,我们看见e10adc3949ba59abbe56e057f20f883e就知道他的密码是什么了?

类似的,诸如CSDN等内奸会时不时把用户密码明文公布出来;那么,我们把这些密码的MD5都算出来,将来遇到了是不是就知道密码明文了?

比如,这位CSDN用户的密码可谓极尽巧思:ppnn13%dkstFeb.1st(娉娉袅袅十三余,豆蔻梢头二月初),如果你暴力尝试,一个个MD5算过来,算到宇宙毁灭都凑不出这个密码。

但现在有内奸CSDN帮忙,他是不是就惨了?

假如他在腾讯、在证券交易网站、在网上银行仍然使用这个密码,我们见到MD5值f2b49a13aaff0911f30e12ee4e23d8b8,是不是马上就知道对应的密码是“ppnn13%dkstFeb.1st”?

如果没有内奸帮忙,ppnn13%dkstFeb.1st这种密码本来就是不可能从f2b49a13aaff0911f30e12ee4e23d8b8反推出来的。但一旦曝光过,这个密码马上就成了最不安全的密码。

换句话说,逆向破解虽然不可能;但我们可以正向算出常见密码的MD5,然后查受害者的密码的MD5值是否在已经泄露的密码里面。


除了CSDN这种内奸,正常点的网站都不会存储明文密码,起码也要做个MD5。也就是不保存123456,而是保存MD5(123456)的值e10adc3949ba59abbe56e057f20f883e。

但如前所述,简单的一步MD5太容易逆推出原始密码;为了抵抗这种简单的逆推,负责任的网站会给你的密码后面附加一个字符串(术语叫加盐),也就是不报存MD5(123456),而是保存MD5(123456+abcd)。这样万一信息泄露,攻击者就不可能看见MD5值马上就知道你的密码是什么了。

但盐必须每个用户都各自不同。因为如果网站100万用户都是密码+abcd的话,攻击者只需把内奸暴露出来的密码后面都加上abcd再算一遍MD5,照样能识别出那些用了暴露过的密码的倒霉蛋。

反之,每个用户加的盐都不一样,那么攻击者就只能针对每个用户都算一遍MD5——如果你用了123456,照样救不了你;但如果你用的密码稍微复杂一点,这个计算量就非常大了,或许就能帮你多拖延几天时间,给你机会补救。

当然,你的密码最好还是从未泄露过、不在任何已知密码里面的。这样攻击者永不能知道你的密码——除非内奸泄露了你的密码明文。


另外还有个东西叫“彩虹表”——把8位密码穷举一遍、记录所有对应的MD5,这事暂时还办不到,需要的计算时间、存储空间都太多了。

但彩虹表允许把密码归结到若干“碰撞链”上,从而压缩存储空间和计算量。那么对于不够长、且只使用了普通字符的密码来说,一个100G或更大的彩虹表就能全部涵盖。

换句话说,为了安全,密码长度必须大于8(越长越好),使用大小写英文字母、数字以及#$%^&*之类特殊符号,不要使用现成的英文单词或者一两个单词的组合……

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多