赞
踩
消息认证码 ---- 消息被正确传递了吗?
张三和李四的故事
张三和李四分别是两家银行。张三银行通过网络向李四银行发送了一条汇款请求,李四收到的消息是:
当然李四银行所收到的汇款请求内容必须与张三银行所发送的内容完全一致。如果攻击者在中途将张三银行发送的汇款请求进行篡改,那么李四银行就必须要能够识别出这种篡改。否则攻击者将收款账户改成自己账户,那1000W就会被盗走。
回想一下,这条汇款请求到底是不是张三银行发送的呢? 有可能张三银行就没发送过汇款请求。而是攻击者伪装成张三银行发送的。如果汇款请求不是来自张三银行,那么就绝对不能执行汇款。
这就是两个问题。 汇款请求消息的 “完整性” 和 "认证"
消息的完整性(integrity),指的是“消息没有被篡改”这问题,称为完整性也叫一致性。如果能 够确认汇款的请求内容与张三银行所发出的内容完全一致,就相当于确认了消息的完整性,也就意味着消息没有被篡改。
消息的认证(authentication),指的是“消息来自正确的发送者”这一问题。如果能够确认汇款请求确实来自张三银行,就相当于对消息进行了认证,也就意味着消息不是其他人伪装发出的。
消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取自三个单词的首字母,简写为MAC
消息认证码的输入包括任意长度的消息和一个发送者与接收者之间的共享密钥。它可以输出固定长度的数据,这个数据称为MAC值
根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似。但是单向散列函数中计算散列值不需要密钥,而消息认证码中则需要使用发送者有接收者之间的共享密钥。
要计算MAC必须持有共享密钥,没有共享密钥的人无法完成计算MAC值,消息认证就是利用这一特性来完成认证的。和单向散列函数一样,哪怕消息中发生了1比特的变化,MAC值也会产生变化,消息认证码就是利用这一特性来确认完整性的
消息认证码是一种与密钥相关联的单向散列函数。
以下述张三和李四银行为例
HMAC是一种使用单向散列函数来构造消息认证码的方法(RFC2104),HMAC其中H就是Hash的意思。
HMAC中所使用的单向散列函数并不限于一种,任何高强度的单向散列函数都可以被用于HMAC。
使用SHA-1 MD5 RIPEMD-160所构造的HMAC,分别称为HMAC-SHA-1 HMAC-MD5和HMAC-RIPEMD
最后得到的MAC值,一定是和输入的消息以及密钥都相关并且长度固定的比特序列
在消息认证码中,需要发送者和接收者之间共享密钥,而这个密钥不能被主动攻击者获取。如果这个密钥落入攻击者手中,则攻击者也可以计算出MAC值,从而就能够自由的进行篡改和伪装攻击,这样一来消息认证码就无法发挥作用
推荐使用非对称密钥加密消息认证码的密钥,已解决密钥配送问题
假设发送者张三要想接收者李四发送消息,如果使用了消息认证码,接收者李四就能够断定自己收到的消息与发送者张三所发出的消息是一致的,这是因为消息中MAC值只有张三和李四之间的共享密钥才能计算出来。即便攻击者篡改消息,或者伪装成张三发送消息,李四也能够识别出消息的篡改和伪装。
假设李四在接受了来自张三的消息之后,想要向第三方验证这条消息的确是张三发送的。 消息认证码无法进行这样的证明
首先第三方要检验MAC,就需要知道张三和李四之间的共享密钥。
假设李四相信第三方,同意将密钥告知第三方。即便如此第三方也无法判断这条消息是由张三发送的,因为第三方可以认为,即使MAC值正确的发送这条消息的人不一定是张三,可能是李四。
在引入第三方后,张三和李四无法证明是对方发送的消息。原本只有两个人知道密钥,一个是自己。
假设李四收到了包含MAC值的信息,这个MAC值使用张三和李四共享密钥计算出来的,因此李四能够判断这条消息来着张三。
张三可以说这个是李四自己编了一条消息。说白了就是张三和李四吵起来了。
消息认证码无法防止否认
消息认证码是对消息进行认证并确认其完整性的技术。通过使用发送者和接收者之间共享的密钥,就可以识别出伪装和篡改行为
消息认证码可以使用单向散列函数HMAC,对称加密也可以
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。