HMAC的图解

本文介绍了HMAC,它是用单向散列函数构造消息认证码的方法,可使用多种高强度单向散列函数。还详细阐述了HMAC步骤,包括密钥填充、与ipad和opad进行XOR运算、与消息或散列值组合及计算散列值等,最终得到与消息和密钥相关的固定长度MAC值。

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

转载:https://blog.youkuaiyun.com/chengqiuming/article/details/82822933?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.pc_relevant_is_cache&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.pc_relevant_is_cache

 

一 什么是HMAC

HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思。

HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出的新的单向散列函数,也同样可以使用。

使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512。

二 HMAC步骤

1 图例

2 图解

1 密钥填充

如果密钥比单向散列函数分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。

如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。

2 填充后的密钥与ipad的XOR

将填充后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。

XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

3 与消息组合

随后,将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

4 计算散列值

将3的结果输入单向散列函数,并计算出散列值。

5 填充后的密钥与opad的XOR

将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。

XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

166.png

6 与散列值组合

将4的散列值拼在opadkey后面。

7 计算散列值

将6的结果输入单向散列函数,并计算出散列值,这个散列值就是最终的MAC值。

通过上述流程可以看出,最后得到的MAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。

### HMAC加密算法概述 HMAC(Hash-based Message Authentication Code)是一种通过哈希函数结合密钥来验证消息完整性和真实性的机制。该算法接受两个主要输入:一个秘密密钥和待处理的消息,最终输出固定大小的消息摘要[^3]。 ### Java中使用标准库实现HmacMD5 对于Java环境下的开发者来说,可以通过`javax.crypto.Mac`类配合`SecretKeySpec`轻松创建基于不同散列函数的HMAC实例。下面是一个简单的例子展示如何生成HmacMD5签名: ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class HmacMd5Example { public static void main(String[] args) throws Exception { String secretKey = "your-secret-key"; String message = "HellArtisan"; Mac sha256_HMAC = Mac.getInstance("HmacMD5"); SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(), "HmacMD5"); sha256_HMAC.init(secret_key); byte[] hmacData = sha256_HMAC.doFinal(message.getBytes()); System.out.println(Base64.getEncoder().encodeToString(hmacData)); } } ``` 这段代码展示了怎样初始化Mac对象并指定使用的具体变种——这里选择了HmacMD5;接着设置密钥并通过调用doFinal()方法完成对目标字符串编码后的字节数组转换操作[^1]。 ### Python环境下HMAC的应用实践 Python社区提供了丰富的第三方模块支持多种安全协议开发工作,在涉及HMAC场景时通常会选择pycryptodome或者cryptography这类成熟的开源项目。以下是采用PyCryptodome库的一个简单案例说明: ```python from Crypto.Hash import HMAC, MD5 from base64 import b64encode def generate_hmac_md5(key: str, msg: str) -> str: h = HMAC.new(key.encode('utf-8'), digestmod=MD5) h.update(msg.encode('utf-8')) return b64encode(h.digest()).decode() if __name__ == "__main__": key = 'secret' text = 'Hello Artisan' print(generate_hmac_md5(key, text)) ``` 此脚本演示了利用Crypto.Hash.HMAC模块构建HMAC-MD5的过程,并将结果进行了Base64编码以便于网络传输或存储[^2]。 ### 鸿蒙操作系统中的cryptoCJ库特性 针对华为推出的HarmonyOS平台而言,官方提供了一套名为cryptoCJ的安全组件集合用于满足各类应用场景下对于数据保护的需求。其中就包含了对HMAC的支持,允许用户选择不同的基础哈希算法如SHA系列以及MD5等来进行消息认证码计算。这不仅增强了系统的灵活性同时也提高了整体性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值