在前面的章节中,介绍了对通信消息的加密,可以保证保密性(机密性)。虽说中间人无法解密通信消息的内容,但是可以篡改通信的消息。在接受者视角来看,是无法识别通信消息是否被篡改。因此,必须引入一种机制,保证消息的完整性。
单向散列函数
单向散列函数将任意长度的数据通过一个hash散列函数,转换成具有固定长度的值,即为hash值。单向散列函数,有多个别称,比如Hash算法,消息摘要算法(Message Digest Algorithms)。
特点:
- 相同的数据计算的hash摘要值相等。
- 整个hash过程是一个单向的,很难从hash值逆向推导出数据的内容,摘要值是不可逆的。
- 原始数据中只要有1个bit变化,两份数据计算的hash值也不同。
应用场景:
-
文件比较:比如在网站上下载文件时,与该文件对应的有其摘要值。为了避免文件在传输过程中被篡改,客户端文件下载完成后,可以通过hash算法计算该文件的hash值是否与网站提供的相等,即可确定文件是否被篡改。再比如平时软件调试时,为了确认运行环境的二进制文件是否升级成功,可以计算编译环境和运行环境中的同名文件的hash值来判定。
-
通信消息摘要:在通信过程中,为了确定消息是否被中间人篡改,也需要对通信的内容计算摘要。
-
身份校验:大家所熟知使用的微信,QQ和支付宝,以及我们的PC登录密码,在系统中存储的是用户密码的hash值,而非用户的原始密码。如果存储的是用户的原始密码,系统一旦出现漏洞,黑客就可能获取到所有用户的原始密码,这是相当严重的网络安全问题。
常见的Hash算法
- MD5:MD5是一种比较常见的Hash算法,摘要值长度固定是128bits。目前已经被证实不安全了。通过彩虹表,对不同的消息组合进行迭代运算,如果运算的Hash值匹配,那么就猜出原文数据了。
- SHA1:SHA1算法的摘要值长度是160bits,在安全性上已经受到质疑。因此,不建议继续使用SHA1算法计算摘要。
- SHA2:SHA2算法目前来说是安全的,且也是目前推荐的Hash算法。主要有四种SHA-256, SHA-224, SHA-384, SHA-512,分别输出256bits, 224bit, 384bits, 512bits。
- SHA3:SHA3算法并不是为了取代SHA2,而是完全不同的算法。主要有四种SHA3-256, SHA3-224, SHA3-384, SHA3-512,分别输出256bits, 224bit, 384bits, 512bits。
消息验证码(Message Authentication Code, MAC)
单向散列函数(Hash算法),只能避免消息被篡改,如果摘要值也被篡改,那么就无法保证数据的完整性了。
因此,需要新引入带秘钥的消息验证码的机制。在对消息计算消息摘要时,连同秘钥一起作为MAC运算的输入,计算得到的MAC值与消息一并发给接受者。接受者接收到的消息与秘钥输入到MAC运算算法,将计算后的MAC值与接收的MAC进行比较,即可确定消息的完整性。
特点:
- 证明消息没有被篡改,保证完整性。
- 证明消息是秘钥拥有者发送。
应用场景:
- 在通信内容无敏感信息时,只是为了保证信息的完整性,防止被篡改,可以使用MAC算法来保证。
- 在加密通信中,可以先基于明文计算MAC值,也可以基于密文计算MAC值,保证消息的完整性。
即便在通信过程中MAC值同样被修改了,那么接收方就无法比较成功。如果需要修改成匹配的MAC值,必须还要获取到通信双方中所使用的秘钥。
常见的MAC算法
- CBC-MAC: 由块密码算法的CBC模式演化而来,最后一个密文的分组的值就是MAC值。在OPENSSL中未直接提供该算法。
- HMAC: 使用Hash算法作为加密基元。常见的有HMAC-SHA-1、HMAC-SHA256、HMAC-SHA512。