123单向散列函数本身不使用任何密钥。例如,如果Cheryl写了一条消息,计算消息摘要,并将其附加在消息后面发送给Scott。Bruce可以在中途截获这条消息,修改消息内容,重新计算消息摘要,附加到消息后面,然后再发送给Scott。当Scott收到该消息的时候,他验证了消息摘要是正确的,但是无法知道消息内容已被Bruce修改过。因为两个消息摘要值是相同的,所以Scott认为消息是Cheryl直接发送的,中途没有经过任何修改。如果Cheryl希望提供更多的保护,那么她需要使用消息身份验证码(MessageAuthenticationCode,MAC)。HAMC:如果Cheryl想要使用HMAC函数来代替散列算法,那么她还需要将一个对称密钥合并在消息的后面。使用散列算法计算已附加密钥的消息,以生成MAC值。将MAC值添加在消息的后面并发给Scott。如果Bruce在中途截获了该消息并修改了它,那么他没有必要的对称密钥来计算Scott将会生成的MAC值。CBC-MAC:如果使用CBC-MAC,那么就在CBC模式下使用对称分组密码对消息进行加密,并将最后输出的密文分组用作MAC。发送方并不传送加密形式的消息,而是传送后面附有MAC值的明文消息。接收方接收到明文消息,然后在CBC模式下使用相同的对称分组密码对消息进行加密,计算出一个独立的MAC值。接收方将这个新MAC值与随消息一起发送的MAC值进行比较。这种方法并不像HMAC那样使用散列算法。CMAC:业界发现了CBC-MAC存在的一些安全问题,进而创建了密码型消息身份验证代码(Cipher-BasedMessageAuthenticationCode,CMAC)。CMAC提供与CBC-MAC相同类型的数据源身份验证和完整性,但在数学上更为安全。CMAC是CBC-MAC的一种变体,它被批准与AES和三重DES一起使用。456