第16章 · 播客 第3集
安全性和保密性设计 · 散列函数与数字签名:MD5 的 128 位
🎙️ 本集播客:第3集:散列函数四个特点逐条辨析、MD5 128 位与 SHA/HMAC 160 位这对最常混的数字、RSA 结合 MD5 签名六步流程、DSS/DSA 一句定位,收在 2004 年 8 月 28 日通过的电子签名法上——两个日期都是送分点。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
明
阿明
上集 RSA 讲完了,这集是不是该讲它跟散列函数怎么搭伙了?
雅
小雅
先立地基。散列函数是一种公开的数学函数;运算的输入信息也叫报文,运算后得到的结果叫散列码,或者叫消息摘要。它有四个特点,判断题、排序题全从这出。
雅
小雅
一,不同内容的报文具有不同的散列码,原始报文哪怕只改变一位信息,算出的散列码也将完全不同——所以散列码好比报文特有的「指纹」。二,散列函数是单向的:求报文的散列码非常容易,根据散列码倒推原始报文非常困难。三,对于任何一个报文,无法预知它的散列码。四,散列码具有固定的长度,不管原始报文多长,运算后的散列码都一样长。
明
阿明
「单向」这条是不是就是所谓不可逆?
雅
小雅
对,易算难逆就是单向。四个特点里三号最容易被忽略——「无法预知」,多选题漏选它就丢分。凭这些特征,散列函数可以用来检测报文的可靠性:接收者对收到的报文用与发送者相同的散列函数运算,得到与发送者相同的散列码,就认为报文没有被篡改,否则报文不可信。
雅
小雅
接下来是一对必背数字。常见的散列函数有 MD5、SHA、HMAC 等。MD5 对输入的报文以 512 位为单位进行处理,生成 128 位长的消息摘要;SHA、HMAC 等算法对任意长度的报文以 512 位为单位进行处理,最后得出 160 位的消息摘要。
明
阿明
512 位分组是共用的,差别在输出:MD5 出 128 位,SHA、HMAC 出 160 位。
雅
小雅
对。经典错项就是「MD5 的散列码长度为 160 位」——把 MD5 和 SHA 混了,看到直接判错。原文那个例子也记一下:不管对一部百科全书还是对某个人的工资做 MD5 散列运算,得到的散列码长度都是 128 位——固定长度的活例子。
明
阿明
那数字签名要解决什么问题?
雅
小雅
原文列了三层需求:接收者能确认信息确实由所声称的发送者发出,不是入侵者伪造冒充的;信息在传送存储中没有被恶意篡改;发送方不能否认自己发出信息的行为,即不可否认性。原文举的例子是买卖双方电子报价单——买方擅自更改收到的单价还声称是卖方发出的,这就是篡改信息。
雅
小雅
数字签名由两个算法组成:签名算法和验证算法。大致过程一句话:信息的发送方对信息利用自己的私钥进行签名,把签名和信息一起发送;接收方收到后利用发送方的公钥对数字签名进行验证,确认其合法性。已有的签名算法原文点名 RSA、ElGamal、Fiat-Shamir、Guillon-Oucsquerrter、DSS、DSA、椭圆曲线等。
明
阿明
直接拿 RSA 签不行吗?为什么非要 MD5 掺和进来?
雅
小雅
效率。原文说得直白:仅仅使用公钥加密算法进行数字签名的运算量比较大,信息量大时速度更慢;而散列算法能对不同长度的信息产生独特的、简短的消息摘要,非常适合用作数字签名。所以做法是:先散列、再加密摘要,不对全文做 RSA。
雅
小雅
RSA 结合 MD5 签名的六步流程,一步都不能跳,我念你跟。第一步,发送者 A 要向 B 发送信息,A 先按双方约定的散列算法对该信息进行散列运算,得到该信息特有的消息摘要 H——改动信息中任何一位,重新算出的摘要值就会与原先不相符,保证不可更改性。第二步,把这个消息摘要用 A 自己的私钥加密,得到 A 对该信息的数字签名 S。
雅
小雅
第三步,A 把信息原文与数字签名 S 一起发送给 B。第四步,B 收到后,先用 A 的公钥对数字签名 S 解密,得到 A 的消息摘要 H。第五步,B 再用同样的散列算法对收到的信息进行散列运算,得到消息摘要 H 一撇。第六步,比较 H 与 H 一撇,相等则说明信息确实来自它所声称的发送者 A。
明
阿明
我复述一遍方向:发送方「散列 → 私钥加密」生成签名,接收方「公钥解密 → 再散列」两头对比。如果传输中被篡改了呢?
雅
小雅
原文的推论是:攻击者篡改了文件,但他并不知道发送方的私人密钥,因此接收方解密得到的摘要 H 与计算后的 H 一撇必然不同,身份确认就露馅了。但注意原文紧跟的那句提醒:这个例子里对传送的信息是以明文出现的,不具有保密意义,实际应用中还要对信息本身运用适当的保密措施。判断题考「数字签名同时保证了机密性」——按教材口径,签名本身不保密。
雅
小雅
RSA 签名的两个特点也考:一,它能证实信息发送方的身份及电子文件的可靠性和完整性,对发送方和被发送的信息都是独一无二的,具有可验证性和不可否认的权威性;二,通过在计算机之间交换数字证书就可以确定当事者就是他们所宣称的人。
明
阿明
签名算法里还有个 DSS/DSA,这俩什么关系?
雅
小雅
一句话定位:DSS 是美国国家标准与技术学会的数字签名标准,1991 年提出;DSS 为计算和验证数字签名指定了一个数字签名算法,就是 DSA。DSA 是 ElGamal 数字签名算法的一个改进版本,通过选择较小规格的参数减少数字签名的数据量,从而减少存储空间和传输带宽。
雅
小雅
DSS 指定 SHA 作为其散列算法,产生 160 位的消息摘要——又一次验证 MD5 是 128、SHA 是 160。然后 DSS 把这一消息摘要与一个用作这个特殊签名的随机数一起输入数字签名算法生成签名;签名函数还依赖发送方的私钥 SK 和一个对许多通信方都公开的全局公钥;验证函数依赖全局公钥和与发送方私钥相匹配的公钥 PK,只有发送方用其私钥才能产生有效签名。
明
阿明
DSS 用 SHA 不是 MD5,这个搭配记住了。最后那部法律呢?
雅
小雅
电子签名法,两个日期一个不能错:2004 年 8 月 28 日,十届全国人大常委会第十一次会议表决通过;自 2005 年 4 月 1 日起施行。内容一句:可靠的电子签名与手写签名或者盖章具有同等的法律效力。选项里把「2004 年 4 月 1 日施行」这类错位日期挑出来就是杀招。
雅
小雅
本集必背:散列函数是公开的数学函数,四个特点——不同报文不同散列码、单向不可倒推、无法预知、固定长度;MD5 以 512 位为单位处理、出 128 位摘要,SHA、HMAC 同样 512 位处理、出 160 位摘要,「MD5 是 160 位」为错;数字签名等于签名算法加验证算法,发送方私钥签、接收方公钥验;RSA 结合 MD5 六步——散列得 H、私钥加密成 S、原文加 S 发送、公钥解出 H、再散列得 H 一撇、两比相等即验真;
明
阿明
接着背。
雅
小雅
签名本身不保密;DSS 是 1991 年美国标准的数字签名标准、指定算法 DSA 是 ElGamal 改进版、散列用 SHA 出 160 位;电子签名法 2004 年 8 月 28 日通过、2005 年 4 月 1 日施行、可靠电子签名与手写签名盖章同等法律效力。
明
阿明
128 和 160 这对数字总算焊死了。下一集数字信封?
雅
小雅
对,数字信封加密钥分配中心:一把对称密钥装进信封,KDC 怎么省掉那 4950 把钥匙。