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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值