消息验证码-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值,所以,消息验证码的方式,无法向第三方证明消息的发送方。

发布了97 篇原创文章 · 获赞 71 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/justinzengTM/article/details/103340982
今日推荐