认证篇——消息认证码

本文深入解析消息认证码(MAC)的原理与应用,包括其使用步骤、密钥配送问题、实例及实现方式,同时探讨了可能遭受的攻击类型及其防御措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、消息认证码介绍

1)消息认证码的使用步骤:

2)消息认证码的密钥配送问题:

3)消息认证码的实例:

4)消息认证码的实现:

二、HMAC(可忽略)

三、对消息认证码的攻击

四、消息认证码无法解决的问题


一、消息认证码介绍

消息认证码(Message authentication code)是一种确认完整性并进行认证的一种技术,简称MAC

消息认证码在输入包括任意长度的消息和一个发送者与接收者之间的共享密钥后,输出固定长度的数据,该数据称为MAC值

 

1)消息认证码的使用步骤:

1)发送者与接收者事先共享密钥

2)发送者根据消息计算MAC值(使用共享密钥)

3)发送者将消息和MAC发送给接收者

4)接收者根据收到的消息计算MAC(使用共享密钥)

5)接收者将自己计算出的MAC与从发送者收到的MAC比对

6)如果MAC一致,接收者可以判定消息的确来自接收者(认证成功);如果不一致,可判断消息不是来自发送方(认证失败)
 

2)消息认证码的密钥配送问题

在认证过程中,需要发送者和接收者共享密钥,且密钥不能被获取;如果密钥落入第三方,第三方可以计算出MAC值,从而能轻易进行篡改和伪装攻击,使得消息认证码没有发挥作用

 

3)消息认证码的实例:

1)SWIFT(环球银行金融电信协会):银行与银行之间通过SWIFT来传递交易信息。为了对消息进行验证和确定消息完整性,SWIFT使用了消息认证码,并使用公钥密码进行密钥交换

2)IPsec:对互联网基本通信协议——IP协议增加安全性的方式之一。在IPsec中,对内容和完整性校验都采用消息认证码

3)SSL/TLS:自网上购物时,使用此类协议。对通信内容认证和完整性校验使用了消息认证码

 

4)消息认证码的实现:

1)使用单向散列函数实现(HMAC)

2)使用分组密码实现(将分组密码的密钥作为消息认证码的共享密钥来使用,并使用CBC模式进行加密)

3)使用流密码或公钥密码来实现

 

二、HMAC(可忽略)

HMAC:是一种使用单向散列函数来构造消息认证码的方法

HMAC的步骤:

1)密钥填充:当密钥短于单向散列函数的分组长度时,就在末尾填充0,直到与单向散列函数的分组成都相同为止;如果长于散列函数的分组时,就是用单向散列函数求出密钥的散列值,将这个散列值用作HMAC的密钥

2)将填充后的密钥与ipad进行XOR:ipad就是将00110110这一比特序列不断重复达到分组长度所形成的比特序列;进行XOR后,就是一个和单向散列函数的分组长度相同,并和密钥相关的比特序列(ipadkey)

3)和消息组合:将ipadkey附加在消息开头

4)计算散列值:将上一部的结果输入单向散列函数后计算散列值

5)将填充后的密钥与opad进行XOR:opad就是将01011100这一比特序列不断重复达到分组长度所形成的比特序列;进行XOR后,就是一个和单向散列函数的分组长度相同,并和密钥相关的比特序列(opadkey)

6)将散列值组合:将4)中计算出的散列值放到opadkey后

7)计算散列值:将6)输入单向散列函数计算散列值,该散列值就是MAC值

 

三、对消息认证码的攻击

1)重放攻击:把以前窃听到的数据原封不动地重新发送给接收方,主要用于身份认证过程,破坏认证的正确性

防御方法:

  • 序号:将每次发送的消息都赋予一个递增编号,并且在计算MAC值时将序号也包含在消息中,第三方无法计算出递增之后的MAC值;缺点:必须要记录每个通信对象的最后一个消息的序列号
  • 时间戳:在发送消息时,附带当前时间,即便收到过去的消息,MAC也能正确将其当作错误消息来处理;缺点:必须要求收发双方的时钟一致
  • nonce:接收者先向发送者发送一个一次性随机数(该随机数称为nonce),发送消息时将nonce包含在消息中计算MAC值,每次通信的nonce都会变化;缺点:通信时的数据量会增加

2)密钥推测攻击:消息认证码也可以使用暴力破解生日攻击,如果可以从MAC值反算出密钥,就可以进行篡改、伪装等攻击;所以对于密钥推测攻击来说,要保证不能根据MAC值推测出通信双方使用的密钥

 

四、消息认证码无法解决的问题

由于收发双方共享相同的密钥,因此无法解决以下问题:

1)对第三方证明

2)防止否认

 

 

 

### 消息认证码(Message Authentication Code, MAC)的定义 消息认证码是一种基于密钥的安全机制,用于验证消息的真实性和完整性。其核心功能在于确保接收到的数据未被篡改,并确认发送方的身份合法[^1]。 MAC 的生成依赖于一个共享的秘密密钥以及输入的消息内容。接收方可以通过相同的秘密密钥重新计算 MAC 值并与接收到的 MAC 进行比较来验证消息的真实性。如果两者一致,则可以确信消息未被修改且来自可信的发送方。 --- ### 消息认证码的实现方式 #### 1. **HMAC (Hash-based Message Authentication Code)** HMAC 是一种广泛使用的 MAC 实现方法,利用哈希函数结合密钥生成固定长度的摘要值。其实现过程如下: - 使用一个共享密钥 \( K \),将其扩展为两个不同的子密钥:\( K_1 = K \oplus opad \) 和 \( K_2 = K \oplus ipad \),其中 \( opad \) 和 \( ipad \) 是固定的填充常量。 - 将消息 \( M \) 输入到哈希函数中,先用 \( K_2 \| M \) 计算中间状态,再用 \( K_1 \| H(K_2 \| M) \) 得到最后的结果。 以下是 HMAC-SHA256 的 Java 实现示例代码: ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class HMACExample { public static String generateHmac(String data, String key) throws Exception { Mac hmac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA256"); hmac.init(secretKey); byte[] macBytes = hmac.doFinal(data.getBytes()); StringBuilder hexString = new StringBuilder(); for (byte b : macBytes) { String hex = Integer.toHexString(0xFF & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } public static void main(String[] args) throws Exception { String message = "This is a test message"; String secretKey = "SecretSharedKey"; System.out.println("Generated HMAC: " + generateHmac(message, secretKey)); } } ``` 上述代码展示了如何使用 `javax.crypto` 包中的类生成 HMAC 值[^3]。 --- #### 2. **CMAC (Cipher-based Message Authentication Code)** CMAC 利用分组密码算法(如 AES)作为基础构建块。它的主要特点是适用于硬件加速环境下的高效实现。具体步骤包括初始化向量设置、分组加密处理以及最终结果截断等操作。 --- #### 安全特性分析 为了有效抵御攻击,MAC 需要满足以下几个条件: - 抵抗穷举搜索攻击; - 攻击者无法伪造有效的消息及其对应的 MAC 值; - 即使部分信息泄露,也不影响整体安全性[^2]。 --- ### 应用场景 在实际应用中,MAC 广泛应用于网络通信协议、文件校验工具等领域。例如,在 Spring Security 中集成 OAuth2.0 授权框架时,可借助 MAC 提供额外一层保护措施以增强用户凭证交换环节的安全性[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值