HMAC 算法

HMAC Hash-based Message Authentication Code, 哈希消息认证码.

HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。就是所谓的加盐 !

运算作用

  • 验证TPM接受的授权数据和认证数据;
  • 确认TPM接受到的命令请求是已授权的请求,并且,命令在传送的过程中没有被改动过。
    定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节。

算法表示

1
2
3
4
5
6
7
8
9
10
11
12
算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M)) [1]
H 代表所采用的HASH算法(如SHA-256)
K 代表认证密码
Ko 代表HASH算法的密文
M 代表一个消息输入
B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
如,SHA-1和SHA-256 B = 64
SHA-384和SHA-512 B = 128
L 表示hash的大小
Opad 用0x5c重复B次
Ipad 用0x36重复B次
Apad 用0x878FE1F3重复(L/4)次

HMAC的应用

hmac主要应用在身份验证中,它的使用方法是这样的:

  • (1) 客户端发出登录请求(假设是浏览器的GET请求)
  • (2) 服务器返回一个随机值,并在会话中记录这个随机值
  • (3) 客户端将该随机值作为密钥,用户密码进行hmac运算,然后提交给服务器
  • (4) 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法.

在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的hmac结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使hmac只在当前会话中有效,大大增强了安全性和实用性。大多数的语言都实现了hmac算法,比如php的mhash、python的hmac.py、java的MessageDigest类,在web验证中使用hmac也是可行的,用js进行md5运算的速度也是比较快的。