消息认证码mac和哈希消息认证码hmac

MAC和HMAC是用于确保信息在加密传输时未被篡改的技术。MAC是基于密钥的哈希函数,通过比较发送和接收时的MAC值来验证消息完整性。HMAC则是更安全的一种,它涉及两次哈希运算,使用ipad和opad进行密钥扩展,增强了抵抗攻击的能力。无论密钥长度如何,都会调整为特定字节长度,以保证安全性。

消息认证码mac和哈希消息认证码hmac

标题消息认证码—MAC

背景:

用于解决信息加密传输过程中,密码(这里通常为对称加密)被破解从而导致的信息篡改,即使得消息接收者可以通过消息认证码mac识别出收到的信息是否已经被篡改。

原理:

mac是一种与密钥有关的hash函数,具体步骤:

  1. 接收方和发送方共享一个密钥K
  2. 发送方将明文消息M和密钥K共同作为mac函数的输入,得到一个mac值,称为A,将A和明文消息M共同加密(使用密钥K)得到密文N,发送给接收方
  3. 接收方收到消息N后,先用密钥K进行解密,得到明文M和mac值A,将明文M和密钥K共同输入MAC函数,重新得到一个MAC值称为B
  4. 比较A和B,若A与B相同,则说明消息没有被篡改

消息认证码机制利用的是hash函数的特点,即便密钥被破解,攻击者也只能看到明文M而无法对明文进行修改。若进行修改则无法保持新生成的mac值与原mac值相同

哈希消息认证码—HMAC

HMAC简述:

HMAC是以字节为单位的,任何数据位数都必须被8整除
HMAC中有两个规定好的数分别为ipad=00110110 opad=01011100(不断循环生成一个B字节长的数据)
HMAC算法的实际运算如下:HMAC(K,M)=H((K⊕opad)∣H((K⊕ipad)∣M))HMAC(K,M)=H((K⊕opad)|H((K⊕ipad)|M))HMAC(K,M)=H((Kopad)H(Kipad)M)
【注】:上式的K是经过处理的,与初始密钥K并不一定相同

算法步骤:

  1. 若密钥K长度大于B,则用H对K进行压缩产生长为B的新密钥K;若密钥K长度小于B,则用0进行填充,形成一个长度为B的新密钥K(要注意经过步骤1后,K与原先的K有区别,为了书写方便,仍将之称为K)
  2. 将K与ipad做异或运算得到ikeypad
  3. 将ikeypad与明文m组合,经过hash函数得到hash sum1
  4. 将K与opad做异或运算得到okeypad
  5. 将okeypad与hash sum1组合,经过hash函数得到hash sum2作为最终结果输出

流程图

给定的参考引用中未包含HMAC哈希消息认证码)实验报告的内容,不过可以先为你构建一份实验报告的大致框架,以下是示例: ### 实验目的 验证消息在传输过程中的完整性真实性,通过HMAC哈希消息认证码)机制防止消息被篡改伪造。 ### 实验原理 HMAC是密钥相关的哈希运算消息认证码,运算利用哈希算法,以一个密钥一个消息为输入,生成一个消息摘要作为输出。其算法公式为:HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))。其中,H代表所采用的HASH算法(如MD5),K代表认证密码,M代表一个消息输入,B代表H中所处理的块大小,Opad用0x5c重复B次,Ipad用0x36重复B次 [^2][^3][^4]。 ### 实验环境 - **操作系统**:如Windows 10 - **开发语言**:Java - **相关库**:Java的`javax.crypto`包 ### 实验步骤 #### 1. 初始化密钥 ```java import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; public class KeyInitialization { public static SecretKey generateKey() throws NoSuchAlgorithmException { KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA256"); return keyGen.generateKey(); } } ``` #### 2. 计算HMAC ```java import javax.crypto.Mac; import javax.crypto.SecretKey; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; public class HmacCalculator { public static byte[] calculateHmac(SecretKey key, byte[] message) throws NoSuchAlgorithmException, InvalidKeyException { Mac mac = Mac.getInstance("HmacSHA256"); mac.init(key); return mac.doFinal(message); } } ``` #### 3. 验证HMAC ```java import javax.crypto.Mac; import javax.crypto.SecretKey; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; public class HmacVerifier { public static boolean verifyHmac(SecretKey key, byte[] message, byte[] receivedHmac) throws NoSuchAlgorithmException, InvalidKeyException { byte[] calculatedHmac = HmacCalculator.calculateHmac(key, message); return java.util.Arrays.equals(calculatedHmac, receivedHmac); } } ``` ### 实验结果 通过运行上述代码,对不同的消息密钥组合进行测试,记录生成的HMAC值以及验证结果。例如,当消息未被篡改时,验证结果为`true`;当消息被篡改后,验证结果为`false`。 ### 实验结论 HMAC机制能够有效地验证消息的完整性真实性。在实验中,只要密钥不泄露,即使消息在传输过程中被篡改,接收方也能够通过验证HMAC值发现篡改行为。 ### 实验总结 本次实验深入理解了HMAC的工作原理实现方式。在实际应用中,HMAC广泛用于网络通信、数据存储等领域,保障数据的安全传输存储。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值