一、前言
信息在传输过程中,因为各种各样的原因容易存在不仅仅存在这丢失的问题,还存在着被篡改的问题,以前看古装电视剧,为了防止信件被打开,用蜜蜡封着口,然后再盖上印,如果蜜蜡被破坏了或印记不完整,就说明信内容可能被篡改了。
而对于现在机制来说HMAC就是传输的信息的蜜蜡+盖章,防止了数据被篡改。
二、看下工作原理
数据在传输过程中,数据有可能字节丢失,这就首先保证数据的完整性,这个用普通的HASH算法就可以办到。
-
数据完整性保证 HASH算法
对信息进行hash算法运算,运算结果就是hash码,hash算法计算速度非常快,而且对数据非常敏感,信息一点有一点变动,hash的结果是不同的。
有没有可能不同的信息产生相同的hash码那,有可能,这就叫hash碰撞,不过密码学里面用的hash是至少是强抗碰撞的,也就是很难找到两个不同的信息其hash结果是相同的。
HASH计算
数据完整是不是就代表数据没有被篡改那,不是,因为还有可能是信息整体包括hash的计算值都被替换了,那如何验证数据是否被篡改那。
Hash算法无法保证
-
数据防篡改和验证保证 HMAC
MAC是Message Authentication Code即消息验证码,这个类比是古代的盖章的蜜蜡。
MAC的两个作用:
1) 保证消息的完整性,防止消息被篡改。
2) 验证消息来源的真实性。
在HASH算法下,第三方可以修改消息,但是在MAC中,由于第三方不知道密钥,所以无法修改消息,也就防止了消息的被篡改,像古代蜜蜡很容易重新点上,但是上面的印章却无法伪造,这就保证了消息的准确性。
MAC(值) = MAC(信息、密钥)
MAC验证过程
这个前提是,通信双方拥有共同的密钥,才可以进行通信,MAC值一般和消息一起传递,消息可以选择加密也可以选择不加密。
三、MAC种类
MAC算法包括CBC-MAC、HMAC。HTTP中多少HMAC。
HMAC 是Hase Base MAC 基于Hash算法的MAC。
HMAC-SHA-1 、HMAC-SHA-256、HMAC-SHA-512
目前我在写的代码解析HTTPS 的TLS1.2中从pre-master key 得到masterkey是需要HMAC算法迭代计算获得的。
四、OpenSSL计算HMAC
1)简单例子
openssl dgst -sha1 private.pem
SHA1(private.pem)= 6707a668c83580ff4dec81241c1d0316539038ed
#计算hash值输出到文件
openssl dgst -sha1 -out digest.txt private.pem
#根据密钥key 来计算hmac
openssl dgst -sha1 -hmac "key" private.pem
HTTPS是将加密和HMAC结合起来的,加密来保证数据机密性,数据机密性不代表不能修改,HMAC来保证数据的完整性。
来一段代码看看:
image.png
说明
文章部分内容和图来自书《深入浅出HTTPS》
读深入浅出HTTPS书笔记