一、 什么是HMAC

HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思,以一个**和一个消息为输入,生成一个消息摘要作为输出。或者简单点说,HMAC就是信息在hash的时候,按照一定规则在信息里添加了一些关键字,增加了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。

(注:通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值,例如,判断用户口令是否正确,我们用保存在数据库中的password_md5对比计算md5(password)的结果,如果一致,用户输入的口令就是正确的。

为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样,大大增加了黑客**的难度。

如果salt是我们自己随机生成的,通常我们计算MD5时采用md5(message + salt)。但实际上,把salt看做一个“口令”,加salt的哈希就是:计算一段message的哈希时,根据不通口令计算出不同的哈希。要验证哈希值,必须同时提供正确的口令。

这实际上就是Hmac算法:Keyed-Hashing for Message Authentication。它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中。

和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全。)

二、算法表示

算法公式 :

HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M)) 

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 )**填充

如果**比单向散列函数分组长度要短,就需要在末尾填充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。

6 )与散列值组合

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

7 )计算散列值

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

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

四、使用场景

1)服务端生成key,传给客户端;

2)客户端使用key将帐号和密码做HMAC,生成一串散列值,传给服务端;

3)服务端使用key和数据库中用户和密码做HMAC计算散列值,比对来自客户端的散列值。

五、安全性

HMAC算法更象是一种加密算法,它引入了**,其安全性已经不完全依赖于所使用的HASH算法

1. 使用的**是双方事先约定的,第三方不可能知道。能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出**。由于不知道**,所以无法仿造出一致的响应。

2. HMAC与一般的加密重要的区别在于它具有“瞬时”性,即认证只在当时有效

消息摘要算法-HMAC算法

相关文章:

  • 2021-11-11
  • 2021-11-17
  • 2022-12-23
  • 2022-12-23
  • 2021-11-17
  • 2021-07-26
  • 2021-06-14
  • 2021-10-20
猜你喜欢
  • 2021-07-09
  • 2021-04-26
  • 2021-09-12
  • 2022-12-23
相关资源
相似解决方案