HMAC简介

HMAC简介

背景


在开放的计算和通信世界(比如Internet)里,我们会使用不可靠的媒介传输和存储信息。如何校验这些信息的完整性(integrity)就变得极其重要。基于密钥作完整性校验的方法常称为MAC(message authentication codes)。通常MAC 用在共享密钥的两方之间,校验来回传递的信息。例如:

 

某公司对来自网络的欺诈性订单叫苦不迭。为了改变这种局面,公司分配给每位客户一个唯一的密钥。客户每下一个订单,均需要提供订单的MAC签名(用这个密钥计算得来)。因为公司有客户的密钥,所以自然能够验证此订单:1. 是否来自所声明的客户,2.是否被篡改了。

 

有很多种结合hash 函数和密钥的MAC实现方法。我们假设H 是一个hash 函数,‘+’ 代表连接运算. 下面的等式便代表一个能轻松实现MAC的方法:

 

MAC= H( key + message )

 

但是,上述方法存在一个严重的安全漏洞:利用大部分hash函数的内部实现机制,很容易在不知道密钥的情况下,通过附加数据到message, 便能产生一个有效的MAC (具体参见Hash Length Extension Attacks by Douglass Clem, March 30, 2012,https://blog.whitehatsec.com/hash-length-extension-attacks/and http://en.wikipedia.org/wiki/Length_extension_attack).

 

当然还有其他容易的替代方法,比如:MAC = H(message + key) 或者 H(key +message + key)。但是它们依旧存在安全隐患 (具体参见[Bellare+96]).

 

正是这些粗陋的MAC实现方法让大家意识到需要一种靠得住的MAC实现方法,这便是HMAC的由来。


定义


下面的定义抄自[RFC2104]:

 

HMAC (k,m) = H ( (k XOR opad ) + H( (k XORipad ) + m ) )

其中

H is 是一个Hash函数, 比如, MD5, SHA-1and SHA-256,

k 是一个密钥,从左到右用0填充到hash函数规定的block的长度,如果密钥长度大于block的长度,就对先对输入key作hash。

m 是需要认证的消息,

+ 代表“连接”运算,

XOR 代表异或运算,

opad 是外部的填充常数(0x5c5c5c…5c5c, 一个block长度的十六进制常数constant),

ipad 是内部填充常数 (0x363636…3636,一个block长度的十六进制常数constant)。

 

特定HMAC实现需要选择一个特定的hash函数。这些不同的HMAC实现通常标记为:HMAC-MD5,HMAC-SHA1, HMAC-SHA256等等. 论文 [Bellare+96]对HMAC的安全性作了全面的分析。

 


References

1.      [Bellare+96]

Mihir Bellare, Ran Canetti, Hugo Krawczyk ,Keying Hash Functions for Message Authentication, 1996, Advances in Cryptology— CRYPTO ’96, Lecture Notes in Computer Science Volume 1109, 1996, pp 1-15.

 

2.      [RFC2104]

http://tools.ietf.org/html/rfc2104

 

3.      Hash-based messageauthentication code

http://en.wikipedia.org/wiki/Hash-based_message_authentication_code

 

### HMAC算法简介 HMAC(Keyed-Hashing for Message Authentication)是一种基于哈希函数的消息认证码,它通过结合密钥和哈希函数来提供消息完整性验证和身份验证的功能[^1]。HMAC支持多种哈希算法,如MD5、SHA-1、SHA-256等。 以下是关于如何实现HMAC算法的一个具体示例: --- ### Python中的HMAC实现代码 Python标准库`hashlib`提供了对HMAC的支持,下面是一个简单的HMAC-SHA256实现示例: ```python import hmac import hashlib def generate_hmac(key, message, digestmod=hashlib.sha256): """ 使用指定的哈希算法生成HMAC签名。 参数: key (bytes): 密钥,用于计算HMACmessage (bytes): 待处理的数据。 digestmod: 哈希算法,默认为sha256。 返回: str: 计算得到的十六进制表示的HMAC值。 """ h = hmac.new(key, message, digestmod=digestmod) return h.hexdigest() # 测试数据 key = b'secret_key' # 秘钥 message = b'This is a test message.' # 输入消息 result = generate_hmac(key, message) print(f"HMAC(SHA256) of the message: {result}") ``` 上述代码展示了如何利用Python内置模块`hmac`和`hashlib`生成一个基于SHA-256的HMAC值[^2]。 --- ### C语言中的HMAC实现代码 如果需要在C语言环境中实现HMAC功能,则可以借助开源库mbedTLS完成。以下是一个使用mbedtls实现HMAC的例子: ```c #include <stdio.h> #include "mbedtls/md.h" void mbedtls_hmac_example() { unsigned char key[] = "secret_key"; const char *msg = "This is a test message."; size_t msg_len = strlen(msg); unsigned char output[mbedtls_md_get_size(MBEDTLS_MD_SHA256)]; mbedtls_md_context_t ctx; const mbedtls_md_info_t *md_info; md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); mbedtls_md_init(&ctx); mbedtls_md_setup(&ctx, md_info, 1); // 设置为HMAC模式 mbedtls_md_hmac_starts(&ctx, key, sizeof(key)-1); mbedtls_md_hmac_update(&ctx, (const unsigned char *)msg, msg_len); mbedtls_md_hmac_finish(&ctx, output); mbedtls_md_free(&ctx); printf("HMAC result:\n"); for(int i =0; i<mbedtls_md_get_size(md_info);i++) { printf("%02x",output[i]); } printf("\n"); } int main(){ mbedtls_hmac_example(); return 0; } ``` 此代码片段演示了如何使用mbedTLS库创建并计算一条消息的HMAC值。 --- ### 关于HMAC的安全性和应用 HMAC的核心优势在于其安全性依赖于底层哈希函数的选择以及秘钥管理的有效性。为了确保通信安全,在实际部署过程中应遵循如下原则: - **选择强健的哈希函数**:推荐采用SHA-2系列而非较老的MD5或SHA-1。 - **保护好私有秘钥**:任何泄露都会使整个机制失效。 - **定期更换秘钥**:减少长期固定秘钥可能带来的风险。 此外,HMAC广泛应用于API请求签名、网络协议设计等领域中以保障数据传输过程中的真实性与一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值