JobbyM's Blog

一日一练-网络 了解Nonce

子曰:了解一下Nonce

Nonce,Number used once或Number once的缩写,在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值,在加密技术中的初始向量和加密散列函数都发挥着重要作用,在各类验证协议的通信应用中确保验证信息不被重复使用以对抗重放攻击(Replay Attack)。

消息认证码

0x00:定义
消息认证码(Message Authorization Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为 MAC
消息认证码的输入包括任意长度的 消息 和一个发送者和接受者之间 共享的密钥,它可以输出固定长度的数据,这个数据称为 MAC 值
简单理解为, 消息认证码是一种与密钥相关的单向散列函数。下图左侧为单向散列函数,右侧为消息认证码

0x01:使用
下图是Alice 银行向Bob 银行使用消息认证码发送汇款请求信息

0x02:攻击
对消息认证码的攻击,主动攻击者Mallory 可以将事先保存的正确MAC 值不断重放来发动攻击,称为 重放攻击(Replay Attack),重放攻击不需要破解消息认证码,只需要将窃取的正确MAC 值不断重复使用而已。
下图就是重放攻击示意图

0x03:防御
下面是几种防御重放攻击的方法
1.序号
约定每次都对发送的消息赋予一个递增的编号(序号),并且在计算MAC 值时将序号也包含在消息中。这样一来,由于攻击者Mallory 无法计算序号递增之后的MAC 值,因此就可以防御重放攻击。缺点是对每个通信对象都需要记录最后一个消息的序号。

2.时间戳
约定在发送消息时包含当前的时间,如果收到以前的消息,即便MAC 值正确也将其当作错误的消息来处理,这样就能够防御重放攻击。这种方法虽然有效,但是发送者接受者的时钟必须一致,而且考虑到通信的延迟,必须在时间的判断上留下缓冲,于是多多少少还是会存在可以进行重放攻击的空间。

3.nonce
在通信之前,接受者先向发送者发送一个一次性的随机数,这个随机数一般称为nonce。发送者在消息中包含这个nonce 并计算MAC 值。由于每次通信时nonce 的值都会发生变化,因此无法进行重放攻击。这种方法虽然有效,但通信的数据量会有所增加。

参考文档

1.基于timestamp和nonce的防止重放攻击方案
2.前后端分离之JWT 用户认证
3.《图解密码技术(第三版)》 8.7 对消息认证码的攻击