HMAC算法原理

HMAC算法是一种基于密钥的报文完整性的验证方法 ,其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。 HMAC算法可以用来作加密、数字签名、报文验证等 。(我感觉实际情况中用HMAC做加密也是为的不可逆加密,不像用DES/AES这种可逆加密;感觉HMAC和随机盐Hash算法非常像)

一句话总结:HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

HMAC算法的定义

HMAC算法是一种执行“校验和”的算法,它通过对数据进行“校验”来检查数据是否被更改了。在发送数据以前,HMAC算法对数据块和双方约定的公钥进行“散列操作”,以生成称为“摘要”的东西,附加在待发送的数据块中。当数据和摘要到达其目的地时,就使用HMAC算法来生成另一个校验和,如果两个数字相匹配,那么数据未被做任何篡改。否则,就意味着数据在传输或存储过程中被某些居心叵测的人作了手脚。

HMAC算法的定义用公式表示如下:

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

HMAC算法的加密步骤

(1) 在密钥K后面添加0 或者 对密钥K用H进行处理 来创建一个字长为B的字符串。(例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00;如果K的字长是120字节,B=64字节,则会用H作用于K后产生64字节的字符串)

(2) 将上一步生成的B字长的字符串与ipad做异或运算。

(3) 将数据流text填充至第二步的结果字符串中。

(4) 用H作用于第三步生成的数据流。

(5) 将第一步生成的B字长字符串与opad做异或运算。

(6) 再将第四步的结果填充进第五步的结果中。

(7) 用H作用于第六步生成的数据流,输出最终结果 。

用图表示就是:

HMAC算法的伪码实现
function hmac (key, message) {
if (length(key) > blocksize) {
key = hash(key) // keys longer than blocksize are shortened
}
if (length(key) < blocksize) {
// keys shorter than blocksize are zero-padded (where ∥ is concatenation)
key = key ∥ [ 0x00 * (blocksize - length(key))] // Where * is repetition.
}
o_pad = [ 0x5c * blocksize] // Where blocksize is that of the underlying hash function
i_pad = [ 0x36 * blocksize]
o_key_pad = o_pad ⊕ key // Where ⊕ is exclusive or (XOR)
i_key_pad = i_pad ⊕ key
return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) // Where ∥ is concatenation
}
HMAC算法的典型应用

HMAC算法的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:

(1) 先由客户端向服务器发出一个验证请求。

(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。

(3) 客户端将收到的随机数与自己的密钥进行HMAC-SHA1运算并得到一个结果作为认证证据传给服务器(此为响应)。

(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-SHA1运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户 。

HMAC算法的安全性

HMAC算法引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,安全性主要有以下几点保证:

(1)使用的密钥是双方事先约定的,第三方不可能知道。由上面介绍应用流程可以看出,作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。

(2)在HMAC算法的应用中,第三方不可能事先知道输出(如果知道,不用构造输入,直接将输出送给服务器即可)。

(3) HMAC算法与一般的加密重要的区别在于它具有“瞬时”性,即认证只在当时有效,而加密算法被破解后,以前的加密结果就可能被解密。

(0)

相关推荐

  • 三. 散列算法概述与部分详解

    2.2 散列算法介绍 2.2.1 散列算法(函数) 概念 散列函数没有密钥,散列函数就是把可变输入长度串(叫做预映射, Pre-image)转换成固定长度输出串(叫做散列值)的一种函数. 散列函数又可 ...

  • PHP的OpenSSL加密扩展学习(一):对称加密

    PHP的OpenSSL加密扩展学习(一):对称加密 我们已经学过不少 PHP 中加密扩展相关的内容了.而今天开始,我们要学习的则是重点中的重点,那就是 OpenSSL 加密扩展的使用.为什么说它是重点 ...

  • 从传感器到算法原理,机器人、视觉避障都在这里了

    避障是指移动机器人在行走过程中,通过传感器感知到在其规划路线上存在静态或动态障碍物时,按照 一定的算法实时更新路径,绕过障碍物,最后达到目标点. 不管是要进行导航规划还是避障,感知周边环境信息是第一步 ...

  • 自动驾驶技术的算法原理、技术大图,以及未来发展

    导读:车在给人们生活带来便利的同时,也导致了交通拥堵.环境污染.交通事故等诸多问题.交通事故不仅带来巨大的经济损失,对生命健康的危害更加严重.实现安全.智能化的自动驾驶技术成为了人们的愿望.阿里巴巴布 ...

  • 论文|Sentence2Vec & GloVe 算法原理、推导与实​现

    Sentence2vec Sentence2vec 是2017年发表于ICLR(国际学习展示回忆)的一篇论文,其全称为:A Simple but tough-to-beat baseline for ...

  • 深入理解 CAS 算法原理

    深入理解 CAS 算法原理

  • GIS算法原理与开发-实体数据结构多边形面积计算

    多边形面积的计算也比较简单,以实体数据结构为例. 该多边形有5个顶点围成,其中三个点构成多边形的上半部分,两个点构成多边形的下半部分.如果计算上边界以下部分的面积,并且减去下边界以下部分的面积,就可以 ...

  • (娓娓道来)五子棋AI算法原理,博弈树、极大极小搜索、αβ剪枝

    这是我本科时的一篇文章了-依稀还记得当晚写完大作业,通宵肝出这篇文章的激动,也是我csdn上阅读量最高的文章,献给大家! 我在最近撰写五子棋AI程序设计报告时,翻阅了很多的资料博客,但却发现大佬们的博 ...

  • 敏感词过滤的算法原理之 Aho

    参考文档 http://www.hankcs.com/program/algorithm/implementation-and-analysis-of-aho-corasick-algorithm-i ...

  • ZAO 背后的深度学习算法原理浅析

    ZAO最近火爆,成为现象级产品之一,引起大家的广泛关注,ATA上面已经有同学做了一些说明分析. 上面文章介绍了ZAO是基于deep fake算法演变出来的一种产品,并提供了deepFake lab的下 ...

  • WEBRTC AEC3算法原理

    延迟估计算法 原理 AEC3的延迟估计算法与AEC的非线性处理的延迟估计算法思想一致,因为回声能量是呈指数衰减,所以计算滤波器能量最大块作为延迟估计值,但是比AEC的延迟估计算法复杂的多 AEC3延迟 ...