一娜搂、前言
信息在傳輸過程中,因?yàn)楦鞣N各樣的原因容易存在不僅僅存在這丟失的問題吱抚,還存在著被篡改的問題百宇,以前看古裝電視劇,為了防止信件被打開秘豹,用蜜蠟封著口携御,然后再蓋上印,如果蜜蠟被破壞了或印記不完整既绕,就說明信內(nèi)容可能被篡改了啄刹。
而對于現(xiàn)在機(jī)制來說HMAC就是傳輸?shù)男畔⒌拿巯?蓋章,防止了數(shù)據(jù)被篡改凄贩。
二誓军、看下工作原理
數(shù)據(jù)在傳輸過程中,數(shù)據(jù)有可能字節(jié)丟失疲扎,這就首先保證數(shù)據(jù)的完整性昵时,這個(gè)用普通的HASH算法就可以辦到。
-
數(shù)據(jù)完整性保證 HASH算法
對信息進(jìn)行hash算法運(yùn)算椒丧,運(yùn)算結(jié)果就是hash碼壹甥,hash算法計(jì)算速度非常快壶熏,而且對數(shù)據(jù)非常敏感句柠,信息一點(diǎn)有一點(diǎn)變動(dòng),hash的結(jié)果是不同的棒假。
有沒有可能不同的信息產(chǎn)生相同的hash碼那溯职,有可能,這就叫hash碰撞帽哑,不過密碼學(xué)里面用的hash是至少是強(qiáng)抗碰撞的缸榄,也就是很難找到兩個(gè)不同的信息其hash結(jié)果是相同的。
數(shù)據(jù)完整是不是就代表數(shù)據(jù)沒有被篡改那祝拯,不是甚带,因?yàn)檫€有可能是信息整體包括hash的計(jì)算值都被替換了,那如何驗(yàn)證數(shù)據(jù)是否被篡改那佳头。
-
數(shù)據(jù)防篡改和驗(yàn)證保證 HMAC
MAC是Message Authentication Code即消息驗(yàn)證碼鹰贵,這個(gè)類比是古代的蓋章的蜜蠟。
MAC的兩個(gè)作用:
1) 保證消息的完整性康嘉,防止消息被篡改碉输。
2) 驗(yàn)證消息來源的真實(shí)性。
在HASH算法下亭珍,第三方可以修改消息敷钾,但是在MAC中枝哄,由于第三方不知道密鑰,所以無法修改消息阻荒,也就防止了消息的被篡改挠锥,像古代蜜蠟很容易重新點(diǎn)上江滨,但是上面的印章卻無法偽造窖剑,這就保證了消息的準(zhǔn)確性味廊。
MAC(值) = MAC(信息暮顺、密鑰)
這個(gè)前提是,通信雙方擁有共同的密鑰蝙茶,才可以進(jìn)行通信宵呛,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算法迭代計(jì)算獲得的该肴。
四情竹、OpenSSL計(jì)算HMAC
1)簡單例子
openssl dgst -sha1 private.pem
SHA1(private.pem)= 6707a668c83580ff4dec81241c1d0316539038ed
#計(jì)算hash值輸出到文件
openssl dgst -sha1 -out digest.txt private.pem
#根據(jù)密鑰key 來計(jì)算hmac
openssl dgst -sha1 -hmac "key" private.pem
HTTPS是將加密和HMAC結(jié)合起來的,加密來保證數(shù)據(jù)機(jī)密性匀哄,數(shù)據(jù)機(jī)密性不代表不能修改秦效,HMAC來保證數(shù)據(jù)的完整性。
來一段代碼看看:
說明
文章部分內(nèi)容和圖來自書《深入淺出HTTPS》
讀深入淺出HTTPS書筆記