
合同
看到这个签名,就知道文件确实来自微软,未被修改(如嵌入病毒之类)。现代操作系统会自动校验该签名,若校验失败则拒绝执行。这完全杜绝了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位密码的彩虹表依旧极其困难。计算一个范围较大的彩虹表都可算是壮举,得持续数周甚至数月的运算;你这一下子要算一百万个……
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号