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.易做图.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
补充:综合编程 , 安全编程 ,