为什么要消息认证码

消息认证码的概述

消息认证码的主要作用就是为了验证消息的来源以及正确性,将明文信息与密钥结合,最后生成唯一对应的散列函数值,如果接收者不能解密该函数散列值,或者散列值不正确都说明本次信息的传递是失败的,因为证明本次信息传递正确性的凭证已经错误了。

一个问题

现在思考一个问题,既然我将信息使用加密之后然后发送过去,如果对方可以解出来不久证明信息的来源是正确的吗?为什么还要消息认证码?

原因1:

首先信息发送过去就算可以被解密也不一定代表消息就是正确的,加密仅仅是使得内容不被别人查看,但是却不能保证内容不被篡改。我们都知道对称加密是的解密是将拿到的密文执行加密的反操作,比如我的一个文件很大,然后我加密之后发送出去,当对端接受到这个内容之后,我还需要执行很长时间的反操作,这无疑拖慢了正确信息的接受,因为我解开之后才发现内容已经被别人修改过了,里面都是看不懂的东西。现在我使用消息认证码,消息认证码首先的特点就是内容长度小,所以当接收端接收到该内容的时候就可以很快的判断本次内容接受的正确性。

原因2:

即便中间人不知道你密文的信息,但是如果密文中有规律可循,比如你使用的分组模式是ECB,那么中间人通过对密文顺序排列的重新组合,那么就会使得密文解密出来的内容是完全不一样的样子,所以即便接收者拥有对称密钥可以唯一解出密文,但是也不能保证内容的正确性,因为解密操作仅仅是执行反操作,所以在执行解密操作的时候中间人也能操作密文解密后的内容,密文内容的内容很有可能被篡改了。

原因3:

假设我们之间要交换一些随机数用作相关算法使用,然后我们使用对称加密进行加密,中间人假设知道你很需要这个随机数,然后它就进行相关的篡改,因为它交换的内容本身就是随机数,所以一些微小的修改在解密后可能也很难用人眼看出来。但是中间人修改了随机数,使得双方的通信造成了影响。

原因4:

之所以我们使用单向散列函数作为内容的校验函数,就是因为单向散列函数的强抗碰撞性,我们使用单向散列函数的散列值就可以将其视为一种信息的代表,只要该信息代表是正确的,那么信息就是正确的。只有单向散列函数和对称加密的结合才能很好的保证数据的来源正确性和数据的正确性。

我们现在来假设中间人想要去进行相关的欺骗和误导,消息认证码是如何保证信息的来源正确性和正确性的

方式1:中间人通过修改内容尝试欺骗接收者

接收者接受到相关的错误的信息,同时也接受到正确的消息认证码,接收者将消息认证码进行解密同时也将错误的信息使用密钥进行解密,然后再将解密后的明文进行消息认证码的计算,最后再通过消息认证码的比对,发现比对不上,所以本次不接收该信息

方式2:中间人通过同时伪造消息认证码和信息内容去欺骗接收者

接受者接收到这一对错误的信息和消息认证码,但是因为中间人根本不知道他们之间的对称密钥,所以当接收者使用对称密钥进行信息的解密后,并将明文信息进行消息认证码的计算,然后再将计算出来的消息认证码和接收到的消息认证码进行比对,发现是根本对不上的。除非中间人获取到通信双方的对称密钥,不然接收者在进行消息认证码的比对的时候是一定对不上的。如果我们仅仅使用对称加密,然后根据接收能否解密来判断信息的正确性,这肯定是远远不够的,因为解密出来的信息在有些情况是人眼不能判断错对的,在有的时候解密出来的内容早就已经被人修改了。所以在这里还是一再强调消息认证码和对称加密的结合。

消息认证码的实现

1、使用对称加密,使用某些指定的分组模式作为最后的消息认证码,在有些分组模式下,比如CBC模式,最后一个分组的内容受到全部分组的影响,所以使用CBC模式的最后一个分组作为整体信息的代表是很合理的。

2、使用可结合密钥的单向散列函数

认证和加密的组合

Encrypt-then-MAC(先加密明文,后计算MAC):顾名思义,先对明文进行加密,然后再根据密文进行MAC值的计算,接收者接收到密文,然后根据密文进行MAC值的计算,最后将计算出来的MAC值和接收到的MAC值进行比较即可

Encrypt-and-MAC(一边加密明文,一边计算明文的MAC):顾名思义,同时对明文进行加密和MAC值的计算,接收者先将密文解密成明文,然后根据明文进行MAC的计算,然后再将计算出的MAC值和接收到的MAC值进行比较即可

MAC-then-Encrypt(先计算明文的MAC,然后将明文和MAC进行并行加密):先计算明文的MAC值,然后再同时对MAC值和明文进行加密,接收者需要先将加密后的MAC值进行解密,然后将密文解密成明文,然后根据明文进行MAC值的计算,最后将计算出的MAC值和计算出的MAC值进行比较即可。

HMAC消息认证码

HMAC前面的H代表的就是HASH函数的意思

可以从上图HMAC的计算方式,首先我们会定义一个密钥,我们会对密钥的长度进行填充,填充长度就是要达到使用的散列函数最后输出的位数,然后使用明文信息和填充后的密钥与0011....0011进行异或操作,然后再将该值进行单向散列函数的计算,我们称该结果为A,然后再讲A和0011....0011进行异或操作,然后再将异或的结果进行单向散列函数的计算,这个结果就是该明文的HMAC值。

HMAC的类型

我们从上图中可以看到HMAC的计算使用了两次的散列函数,根据使用的散列函数的类型,我们将HMAC的类型分为HMAC-SHA1,HMAC-SHA-224,HMAC-SHA-256,HMAC-SHA-384,HMAC-SHA-512,同样的,散列函数的位数越大,其抗碰撞性也就越强。


重放攻击

假设A现在向银行发送一条信息,说A要转给B100块,现在中间人假设就是B,B现在不修改A发送的内容,也不修改消息认证码,它将这个信息保存下来,然后重复100遍发送给银行,银行接收到这个信息,发现可以密文可以解密,同时消息认证码也是正确的,所以它就认为A真的要给B转100遍100块,这样B就赚了一手。这就是重放攻击。

重放攻击可以在报文发送的时候加上序号或是时间戳,如果在上面的例子中我们加上了序号,那么银行就知道这是一个过时的报文,不进行响应,时间戳需要双方同步时钟有一定的困难。

消息认证码的问题

消息认证码的主要问题就是密钥仅仅在A和B之间共享,加入一个信息从A发送了一条辱骂的语句给B,B然后去找A理论,A说B在诽谤他,他根本没有发这个信息,很有可能是B自己伪造的然后诬蔑A的,因为只有A和B共享密钥,而且共享的密钥的长度也是一模一样的,也就是说A和B之间的信息只能由A和B之间解开,没有其他人可以证明某条信息是A或是B发送的,这样就产生了否认性和不可证明的问题。

同时消息认证需要A和B双方共享一个密钥,密钥的分发也是一个问题

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mllllk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值