王小云未破解MD5,那MD5到底有多可靠?

1个回答

写回答

大头考考

2026-01-19 17:20

+ 关注

合同
合同

王小云并非破解MD5,只是使其可靠性降低了。MD5是一种具有高安全等级(密码学安全)的信息摘要算法。信息摘要是什么?例如,张三向你借钱,还打了一张欠条给你:你拿到欠条后起了坏心眼:哟,阿拉伯数字?!张三来还钱的时候,发现欠条变成了:1100竟然变成了77万!你瞧,这样写欠条很危险,一不小心就可能搞得自己倾家荡产。那要如何写才好?这样写就不能再修改了。为何如此?因为现在所用数字结构复杂,添一笔或减一笔不能变成完全不同且无法识别的内容。而且,只要不傻,就不会这么写。留这么大空,不就是等着被人改成这样吗?你瞧,咱们运用复杂的数字写法,还有前后紧凑没法添加字词的金额数字,这样就能确保欠条没法被修改。同样,在数字世界中,我们也能做到这一点。你与人拟定一份合同,将内容敲进记事本。为避免他人乱改,可留张小纸条注明:张三李四在记事本签了份合同,此合同含35个句号、3996字、29971个笔画,在所有笔画里,横有6721个,竖钩有1733个。上面黑体字所标那串关于合同内容特征的数字,即为这份合同的摘要信息。不过,要是我们能改动合同里的几个字,使其意思全然不同,同时总笔画数、横和竖钩的数量都不变,这是不是就能实现偷偷改合同且不被发觉的目的了?这便是所谓的碰撞。显然,这种按笔画统计的摘要算法太过简陋,易被找到碰撞法,安全性不足。MD5是一种更高级、更可靠的摘要算法,理论上修改其摘要内容必然会被发现。MD5/SHA1要方便使用(而非靠小纸条),就得与公钥体系(PKI)中的加密算法(像RSA之类的)配合使用。公钥体系加密算法很神奇,有两个密钥。其中公钥要公开,让众人知晓;另一个是私钥,得妥善隐藏,除自己外绝不能被他人知道。实际上,现在通常把私钥置于专用安全芯片内,一直不离开芯片,使用者都无法接触。不过,为防止设备损坏致使私钥丢失,可能需要找个地方备份一下。它很神奇,信息用公钥加密后只能用私钥解开,若没有私钥,即便自己用他人公钥加密也解不开。反过来,用私钥加密的信息得用与之对应的公钥才能解开。后者我们通常称之为签名,而非加密。公钥是公开的,任何人都可解开,所以用私钥加密信息,无法隐藏信息内容。不过,私钥加密后的内容只有对应的公钥才能解密。那么,若用你的公钥能解开某段密文,这是不是就表明加密者一定是你?毕竟没人知道你的私钥。这便是数字签名。然而,公钥加密算法速度非常慢,我们不会用它加密兆级甚至G级的文档。而是先算出文档的MD5/SHA1摘要,再用公钥算法对该摘要进行签名。这样的话,你跟别人签合同,双方确认合同内容没错后,算出一个MD5。接着对方用私钥对这个MD5签名,你拿他的公钥解密,若确实是合同数字摘要,那你就可以安心了。同样,你若用自己私钥给此MD5签名,合同便成立,到时想抵赖也无计可施。同样,你从互联网下载的程序如今也会带有一个签名。

看到这个签名,就知道文件确实来自微软,未被修改(如嵌入病毒之类)。现代操作系统会自动校验该签名,若校验失败则拒绝执行。这完全杜绝了DOS时代将病毒寄生在程序文件里的危险手段:别说是藏病毒了,就算改动一个二进制位,操作系统也会阻止其加载和运行。显然,数字摘要/签名技术已成为现代信息系统安全的基础保障……我之前说过,把这个合同里共35个句号、3996字、29971个笔画,其中有6721个横、1733个竖钩当作合同摘要并不可靠。毕竟我们完全可能修改合同部分措辞,但横与竖钩这两种笔画数量以及总笔画数却能保持不变。那么,MD5/SHA1就一定无法被篡改吗?或者说,能否找到一种方法,在修改MD5/SHA1签名文件的同时,不改变其MD5/SHA1的值?我们可将篡改能力更细致地划分为几个等级:其中,若能达成2就算是攻破了MD5,达成1自然更算。王小云老师无法做到2,更别提1了。不过她确实找到了一种方法,能轻松找出许多MD5相同但内容不同的数据。打个比方,我不能把合同里的欠账者改成债主,也不能找到一个乱码使其MD5与债主相同。不过,我能找到两个不同的词,它们的MD5相同。要是这两个词不是乱码,并且刚好能在某个合同里找到,那我就能用它们替换,而MD5/SHA1发现不了。所以,王小云老师是成功削弱了MD5/SHA1安全性,但她并没有破解MD5,距离破解还有很大差距。当年CSDN明文保存密码,致使国内IT界密码全部泄露,造成极大危害。这种做法严重违背密码学安全设计原则,简直是毫无常识的乱来。那么,密码要如何正确验证与存储?你想啊,密码要是存磁盘上,别人总有法子摸到那区域然后读出来,是不是?但要是不保存密码,之后用户说要登录时,你如何确认其密码正确?嗯,这里有个细节,不知你留意到没?没错,我们不用确切知晓用户密码,只要确认其密码正确就足以验明身份了,不是吗?但,确认密码正确的前提不就是确切知道用户密码吗?并非如此。之前我们已经探讨过数字摘要了。那么现在,我们能否不存储密码,而是存储密码的数字摘要(通常称为数字指纹finger print)?你瞧,找一个MD5相同的字符串太难了,到现在也只有王小云老师做到了部分成功(是找出两个MD5相同的字符串,而非针对给定字符串找与其MD5相同的另一个字符串)。那我们只要保存密码的MD5,之后用户登录时,我们计算一下他输入密码的MD5,不就能知道他是否真的知道密码了吗?你看,这样一来我们只需保存MD5,没必要存储明文密码,不是吗?更进一步说,远程登录时明文密码从客户端发往服务器,这很危险。那何必传明文密码?传个MD5是不是就可以了?不过,要是你传MD5,别人能记下再传到服务器,这样是不是就能冒充你了?这就是重放攻击。要对抗重放攻击,就需要挑战 - 应答,大概是这么个情况。服务器:报上你的名字!客户端这边:燕人张翼德在此!服务器:行,密码……先等等,别说出密码。听着,这是你第514次登录,我这边的时间是24年4月7日10点43分33秒,而且我也知晓你密码的MD5。现在你既不要告诉我密码,也不要告诉我密码的MD5。你告诉我,把你的密码的MD5与514以及24年4月7日10点43分33秒拼接起来,然后再计算一次MD5,最后得出的这个MD5是多少?客户端:不会进行计算!咳……咳……咳……不开玩笑了。简单来讲,客户端要等用户输入密码,接着计算MD5(MD5(密码)+514+24年4月7日10点43分33秒),再将计算结果发送给服务器,这样就能成功认证了吗?而且,下次他登录时,服务器的问题是否会自动又有变化?比如时间、登录次数等都改变了……这就是挑战-应答。此认证模式既不泄露密码,又能识别重放攻击(他人模仿)。同理,既然能如此验证密码,那密码也可这样存储——仅存MD5,别存明文。然而,仅保存MD5也变得愈发危险了。现在计算机的性能不断增强,存储器的容量也在持续增大。于是,有人提出了彩虹表,这是一种时间换空间的构想,它让存储所有8位以下密码对应的MD5成为可能(实际上依然不太可能,但可以通过R函数合并相同链的方式,极大地压缩存储所需空间)。从另一个角度看,这也是空间换时间:利用海量的磁盘空间预先存储大量密码的MD5摘要,这样只要有MD5,就能反向查找出原始密码,无需逐个计算了。可参考更详细的解释:换个说法,要是仅用MD5算出密码的数字指纹,他人就能搞个很大的字典,列举所有可能的密码。接着算出全部密码的MD5(实际上现在还做不到,但那些较短、简单的密码,像8位以下、纯字母或纯数字的密码,多年前就能放进彩虹表了)。这样只要有办法获取硬盘上存储的密钥指纹,就可能从中找出你的密码了。那该如何是好?注意我的用词:更短、更简单的密码!那么,我们能否人为地将你的密码设置得长一些?可以,这就是盐(salt)。例如,密码为password时,不应存储MD5(password),而要存储MD5(password+ABCEXG),这里的ABCEXG就是添加的盐。当然,为确保验证成功,盐也需记录下来。也就是你的用户名和密码不再是。 而是:这样的话,攻击者就得再准备一个彩虹表了,或者将其指数级扩大,哈哈哈。注意,别所有用户都共用一种盐,不然别人重新建彩虹表就麻烦了。换个说法,要是盐值不变的话,以前的MD5函数为MD5,新的MD5函数就是MD5WithSaltABCEXG,这说到底仍然是一次函数调用,不会多耗费多少CPU时间,也不会让破解难度增加。要是盐值是可变的,新的MD5函数就变为MD5WithSalt(password, uniqueSALT)。由于每个用户的操作不同,攻击者就得制作出与网站用户数量相同的彩虹表。对于拥有100万用户的网站来说,这相当于破解难度提高了100万倍。要知道,即便到现在,计算一个包含特殊字符、字母、数字的8位密码的彩虹表依旧极其困难。计算一个范围较大的彩虹表都可算是壮举,得持续数周甚至数月的运算;你这一下子要算一百万个……

举报有用(0分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号