消息驗證碼-MAC算法總結

密文截獲篡改

如果使用的是對稱加密,即通常一個算法和一個密鑰的情況下,接收方只有使用與加密相同的密鑰,才能解出正確的密文,如果使用了不同的密鑰,解密出來的明文可能就是一串亂碼。假如在確定密鑰是與明文加密密鑰同一個的情況下,解密出來的明文如果是可讀的,明白的,看似就可以確定密文是安全的,完整的,來自發送者發送過來的,其實不然,如果密文信息在發送過程中被別人截獲了,然後修改密文信息,再發送給接收方,那麼接收方即使使用正確的密鑰,解密出來的明文也不是發送方原來的明文。接收方可能在解密後發現明文是雜亂無章的信息,會發現密文被篡改,這種情況還不是最糟糕的,密文在途中被截獲後,中間人可以用暴力破解等方式破解密文,導致信息泄露,假設連密鑰都被破解了,那麼中間人可以使用密鑰任意修改密文,重新加密後發送“錯誤”的密文給接收方。來具體看個例子:

左上角首先用命令對message.txt文件進行加密,並將加密密文和salt,初始化向量iv一起保存到CipherText.txt文件中。從命令中可以看到,使用的是對稱加密的標準算法AES算法(AES加密算法中,密鑰由口令pass和salt一起生成),密鑰長度爲256比特,使用的分組方式是CBC密文分組連接方式,所以纔會使用到初始化向量iv,CBC模式加密時先和iv進行異或運算,再和密鑰進行運算得到密文。

      加密後得到的保存着密文的文件CipherText.txt發送給接收方,接收方進行解密,由上圖看到,使用兩次相同解密指令,初始化向量iv,密鑰和口令都相同的情況下,解密出來的內容不相同,這個例子模擬出來一個場景,第一次解密得到的消息是正確的原文,但如果在發送中間消息就被截獲和修改,那麼使用相同的解密命令,解密出的明文就是第二個,它並不是正確的原文。問題在於,它們都不是一串亂碼或意義不明的語句,對於接收方來說,他可能並不知道,解密後的明文,是不是來自發送者,還是來自被中間人截獲後修改篡改的消息。爲了校驗出消息是否被篡改,需要用到消息驗證碼。

 

消息驗證-MAC值

MAC就是消息驗證碼(Message Authentication Code)的簡稱,是一種與密鑰相關的單向散列函數,它能夠做到驗證消息是來自發送者發送的,正確的沒有被篡改過的。具體做法是:

  1. 發送方和接收方事先共享同一個密鑰。
  2. 發送方將發送消息和密鑰進行MAC運算,得到MAC值,並把MAC值與消息一同發送給接收方。
  3. 接收方接收到消息後,將消息部分與事先共享的密鑰進行MAC運算,得到MAC值,將MAC值與發送方發送的MAC值進行比較,如果一致,證明消息是來自發送方。

在發送方處,將消息和MAC值一起發送給接收方,接收方將收到的密文消息與事先共享的密鑰進行MAC運算,最後和發送方發來的MAC值比對,如果一致,證明消息沒有被篡改,是來自發送方的。因爲MAC值來自於消息與密鑰的運算得到,如果消息一旦有修改,那麼MAC值也會不同,且由於密鑰是通信雙方事先共享的,沒有密鑰也就沒有辦法解出MAC值,MAC算法是與密鑰相關的單向散列算法,根據消息和密鑰得到MAC值,由於單向性,在知道散列值(MAC值)的情況下,也沒辦法解出原始信息,因爲單向散列函數產生的散列值是和原始信息完全不同的比特序列,它並不是一種加密,所以無法逆向根據散列值得到原始信息,消息驗證碼MAC算法就是通過這樣保證消息沒有被篡改的。

 

CBC-MAC和HMAC

消息驗證碼MAC算法有兩種,CBC-MAC和HMAC,CBC-MAC從名稱上看就知道使用到了塊密碼算法的密文分組連接模式,簡單回顧下CBC模式,就是先將密文等分成多個分組數據塊,從第一塊數據塊開始先與一個隨機生成的初始化向量IV進行異或運算,運算結果再和密鑰進行加密運算,得到第一塊分組密文。第二塊數據塊把前一塊數據塊的分組密文當作IV,先與其進行異或運算,再和密鑰進行加密得到第二塊分組密文,這樣下去,第n個分組數據塊會與第n-1個密文分組進行異或運算,然後和密鑰進行加密,得到第n個分組密文,最後將所有分組密文按順序組合在一起,得到完整的密文。CBC-MAC算法就是將最後一個密文分組的值作爲MAC值。

HMAC算法,哈希消息驗證碼,很複雜,不過是最常用的,HMAC使用Hash算法做加密基元,加密基元就是指一些基礎的加密算法,如Hash,一些複雜的加密算法是根據基礎的Hash算法構建出來的,如最上面例子中,對稱加密裏,使用口令pass和salt加Hash運算得到密鑰,Hash算法作爲加密基元,每次salt都不同,保證相同的口令可以生成不同的密鑰。與HMAC配合使用的散列函數有SHA-1,SHA256和SHA512等,通過Hash函數和密鑰得到MAC值,將其與密文一起發送給接收方,待接收方進行驗證。

消息驗證碼MAC算法計算得到MAC值(摘要值),上圖舉例了使用SHA-1散列函數直接對明文計算MAC值,然後輸出到外部文件,和使用SHA-1散列函數加密鑰計算MAC值兩種方式。

 

消息驗證碼的不足

加密算法對消息進行加密處理,即使消息被中間截獲了,如果沒有密鑰,也很難破解出明文,也就無法篡改,如果直接篡改密文,那麼接收方解密出來的明文很可能就是一串亂碼或者意義不明的語句,以發現消息被篡改。爲了驗證消息來自發送者,且是正確的沒有被篡改過的,就要配合使用MAC算法。

消息驗證碼也有無法解決的問題,例如無法向其他人證明該消息是來自對方的,還是自己的。假設A和B雙方進行通信,他們之間事先共享密鑰,使用消息驗證碼的方式計算MAC值。對於不在通信方的C來說,假設A收到來自B的消息,計算MAC值正確,可以證明消息正確來自B,但是A無法向C證明該消息是來自B的,因爲密鑰在A和B之間共享,C可以認爲這個消息是來自A自己的,因爲A也有密鑰,也可以計算出正確的MAC值,所以,消息驗證碼的方式,無法向第三方證明消息的發送方。

發佈了101 篇原創文章 · 獲贊 73 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章