垂直应用

信息安全(三)

密码学基本原理(中)






大家好,欢迎大家观看STM32信息安全(三):密码学基本原理(中)——消息的完整性认证。






本期主要回顾加解密原理的第二部分,如何确保收到的消息是完整可信的。我们会看到,哈希算法可以保证数据的狭义完整性,即消息本身没有被篡改;但是无法保证数据的广义完整性。要确保消息来自可信的对方,需要对消息进行认证。实现这些思想和技术的典型算法,也会做简单介绍。



哈希函数


检查消息是否被修改过的最核心的元素就是哈希函数,又叫散列或者摘要函数。哈希,是英文Hash的英译,“散列” 二字,取的是这个函数把一段不定长度的消息,所谓“散”,映射到固定长度值的过程,映射,所谓“列”。而摘要,则是按函数的运算结果来取名。这个映射过来的固定长度的值,就叫该消息的摘要。




哈希函数是一类函数的统称,不是具体一个函数的名字。

这类函数的特点是:对消息的任何一点改变,摘要值必然也会变化。根据摘要值,无法反推、构造出消息本身,所谓“单向性”。还有就是,很难找到两个不同的消息,它们的摘要值是相同的。即具有很低的碰撞性。


那么Alice要给Bob发消息,她先计算出该信息的摘要,然后把摘要和消息本身一起发给Bob。Bob收到后,把收到的信息也做一个哈希计算,再和收到的消息摘要比较。相同,则说明消息未被篡改。可以看到整个过程,并未有密钥之类的参与。哈希函数的唯一输入就是消息。



几个常用的哈希函数

哈希类函数,有几个常用的具体函数,如表格中所列。



MD5和SHA1已经被破解,不推荐使用。


SHA2,根据输出的摘要值长度不同,分为几种工作模式,Sha-224,256,384和512。常用的是Sha-256。SHA3与sha2完全不同,引入capacity,中间状态是1600位,而不是之前的512位,完全是新一代算法,强度大大增强。SHA3并不是要取代SHa2,sha2现在并没有出现明显的弱点。由于对MD5,Sha1出现成功的破解,NIST(那个美国国标和技术研究院)感觉需要一个与之前算法不同,可替换的加密散列算法,就是SHA3。





完整性 · 安全性



从安全角度来说仅仅Hash,是没法保证消息的广义完整性。

通讯链路上的攻击者可以改变这个消息,重新计算摘要,用改变后的消息 +摘要替换原来的报文。这样Bob对新消息计算哈希值,和收到的哈希值即使比较结果相等,却没有识别出这已经不是Alice发给他的原始消息了。





消息认证

这就需要引入消息认证的概念了。消息认证能够实现从“消息狭义完整性” ,到“消息广义完整性” 的扩展。即,除了核实消息本身没有被篡改,或者传输过程中没有误差的引入。还有一个更加重要的任务,就是核实这条消息 就是真正的 通信对方 发过来的,而不是来自某个“中间人”。



那么这个“扩展”,是以哈希函数Sha2,为基础,结合了加密算法来实现的。细分下来有两类,如果是Sha-2结合对称加解密技术,典型的算法有HMAC,AES-GCM;如果结合非对称加解密技术,典型的算法就是使用RSA/ECC的私钥做签名。




加密算法


HMAC

先来看看HMAC。它是基于对称加解密技术的,因此双方事先要约好一个共享密钥。



Alice给Bob发消息,除了消息本身,同时也会发一个消息摘要。但是这个摘要,不仅仅是对消息本身去做哈希运算,而是把消息和这个共享密钥放在一起,然后做哈希运算。Bob收到消息和摘要后,做同样的操作,然后比对。由于只有Alice拥有这个和Bob做运算的密钥相同的密钥,那么如果比对结果相等,接收到的就一定是Alice发出的。其他人,没有这个密钥,即使截获了消息和摘要本身,即使重新构造了一个假消息,但是没有这个共享密钥,他是无法作出对应的摘要的。这里传输的摘要,就可以看成是消息认证码。在整个过程中,有hash函数,和双方约好的共享密钥参与运算,但是并不需要有加解密的操作,也可以完成。




AES-GCM

AES-GCM是刚才在讲对称加密算法AES时,提到的一个模式。它除了红框里的AES-计数器模式,对明文进行加密;同时,红框外的部分,是有密钥参与的,同时有全部消息的密文,也就是全部消息参与的,计算Tag的过程。这个计算结果Tag,就可以认为是消息认证码。





通信过程和之前的MAC类似。Alice准备好表白信,以及事先和Bob约好的共享密钥,经过AES-GCM运算,生成密文和消息tag;然后加密后的消息,和消息tag,一起发送给Bob。Bob使用约好的密钥解密消息,并使用相同的密钥对解出来的明文也做一次AES-GCM运算,来验证消息tag。从而核实这确实是来自Alice的且没有被改动过的表白信。





签名

另外一种基于非对称加解密技术来认证消息的技术叫做“签名” 。Alice要发表白信给Bob了,她怎么做呢?她先把这份信计算一个摘要值,从可能很长一段话映射到比如256位,32字节的数值,然后拿自己的私钥,对这32节的摘要数值做一个签名运算。然后把表白信和她对这个信件的签名一起发送给Bob。Bob和任何其他人一样,拥有Alice的公钥。使用公钥对信件的签名做验签,得出一个值;然后再把新建也做一个通用的哈希运算。得到的摘要和验签出来的摘要比较,若相同,就证明:第一,这封信确实是Alice发过来的,第二,这封信没有传输误差,或者未被更改。


在这样一个场景里,任何人都有Alice的公钥,因此都可以验证这个消息确实是Alice写的,从而引出一个“不可抵赖性”。因为suppose,Alice的私钥,只有Alice才有。还有就是,这个场景里,表白信并没有被加密。使用的私钥签名,公钥验签技术,保证的是消息的完整性,而不是消息的保密性。



本期回顾


回顾一下本小结的知识点:



我们使用哈希函数可以验证消息的狭义完整性;要核实消息的广义完整性,还需要用到双方事先约好的共享密钥,或者使用私钥签名,公钥验签。可以看到,但凡涉及到密钥,它都有一个归属性,从而可以定位到人,这是密钥之所以能提供消息认证服务的根本原因。


现在,我们知道怎么对要发送的消息加密和对接收到的数据解密;知道怎么对接收到的消息验证它是否被篡改,以及是否来自真正的发送方。


微信扫一扫