怎么验证md5值(如何验证md5值)|全球快报

2023-02-09 09:49:03

来源:财富中国


(相关资料图)

在上数字签名这道密码学的主菜前,今天先品尝一下数字摘要这道重要的前菜,因为数字摘要是数字签名的组成部分。数字摘要,英文叫Hash,所以它也被叫做哈希、熵等名字。它是一种算法,可以将任意长度的原数据运算变换成一个固定长度的结果数据,这个结果数据有两个特点:一是相对于原数据,其长度比较短,比如有16字节、20字节、32字节等等;二是它可以体现原数据的特征,也就是说原数据如果发生变化,计算出来的结果数据也会变化(注意,这里其实有一个大坑,后面会谈到)。

原数据修改,摘要值变化

这两个特点,就类似于我们写文章时经常用到的摘要(很短,但又能体现文章大体内容),这也就是数字摘要的名称的由来,相应的,这个结果数据就叫摘要值、哈希值或熵值(熵也是取其在物理学上表示度量之意)。

前面讲过,非对称加密的一个特点就是慢。所以在使用非对称加密算法的时候,一般不对原数据进行直接加密。后面讲到的数字签名,实质上也是非对称加密运算,就采取了原文的摘要,而不是原文进行加密。这样无论原数据有多大,被加密的数据只有几十个字节,保证了整体运算速度。虽然说数字摘要总是和数字签名在一起,但我想很多程序员都接触过数字摘要,拿它来做单向加密。所谓单向加密,就是指加密结果没办法再解密回明文(对称加密、非对称加密都属于双向加密)。单向加密主要是用做验证,最常见的一个应用场景就是用户口令的单向加密。数据库中存储了用户口令的摘要值,用户登录系统时,系统计算其口令明文的摘要值,然后送到后台对比。这样系统中传输、对比、储存的都是用户口令的摘要值,而不是口令明文,加强了口令的安全性。数字摘要的另一个常用领域就是检查程序的完整性,一个程序运行前,可以计算一下它的摘要值,再与其自带摘要值对比,以确定程序有没有被篡改过。

常用的数字摘要算法(后面是其摘要值长度)有MD5(16字节)、SHA1(20字节)、SHA256(32字节),国产算法的有SM3(32字节)。

最后照例谈一下安全问题。2004年有一个报道说山东大学的王小云教授破解了MD5算法,对于一向不为公众所知的密码领域,这条新闻算是很有轰动效应了。当时很多非专业领域的媒体也纷纷跟进,"MD5已经坍塌"、"密码学的基础已经动摇"这些新闻标题很是带了一波流量。因为使用MD5做单向加密的系统不在少数,所以当时也有很多公司、程序员开始忐忑不安了。

其实,这些都是非专业的观点。前面讲过了,数字摘要指是有固定长度的,也就是说,每一种摘要算法计算出的摘要值的个数是有限的,比如SHA256算法,它的摘要值个数是2的256次方,这个数量大到已经不是天文数字了,而是在人类已知的宇宙里已经没有可以拿来说明这个数到底有多大的实例了。但是,它毕竟还是个数字,SHA256摘要的个数还是有限的,而原数据的数量是无限的。无限的原数据对应有限的摘要值,想象一下小时候学的抽屉原则:三个苹果放进两个抽屉,至少有两个苹果在同一个抽屉里。所以,必然有多个原数据(而且还是无限多个),被放进了同一个抽屉,就是拥有相同的摘要值。这种不同原数据,拥有相同数据摘要现象,叫做碰撞。说到这,肯定有同学会问这不颠覆了最开始说的原数据如果发生变化,数字摘要指也会变化的特征吗?是这样的,这也就是前面说的那个大坑。不管哪种算法,数字摘要必然存在碰撞。其实Hash这个单词来源于拉丁文,本意就有碰撞的意思,那些发明它的数学家一开始就知道数字摘要的吊诡之处。那数字摘要的意义究竟在哪呢,它的意义在于有效碰撞存在的概率为零。所谓有效碰撞,是指发生碰撞的原数据有实际作用和意义。举个例子,比如将"向12345这个账户转10000元。"这条信息修改成"向54321这个账户转10000元。",两条信息如果计算出的摘要值是相同的,但这种碰撞就是有效碰撞,因为这种修改后的原数据是有意义的,篡改者达到了目的而不被发现出来。可以看出来,由于攻击者篡改数据总有的特定目的,不会只为了求碰撞而篡改,所以这种有效碰撞在实际应用中可以说是不存在的,摘要算法还是安全的。王小云教授实际上是发明了一种比较快速找到MD5碰撞的算法,后来她又发明了SHA-1的碰撞算法,其意义在于发现现有算法漏洞,促进摘要算法不断完善发展。好的摘要算法,就是要碰撞率发生足够低。因此MD5算法不存在被破解的说法,我们也仍然不可能从摘要值反推出原文。在实际应用中,我们还可以通过在数据加盐(添加随机数)、多个摘要算法混用的方法进一步降低碰撞概率。

另外,一些宣称可以破解摘要算法的网站(比如),其实是保存了一个原文与对应摘要值的数据库,所谓破解是查询摘要值对应的明文。你输入的摘要值要是不在库里,它就无能为力了。

关键词: