这里来学习一下前辈的关于HMAC-SHA256的文章

HMAC-SHA256是什么?

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种**基于Hash函数和密钥进行消息认证的方法,**并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。

人话:HMAC是一种使用单向散列函数来构造消息认证码的算法。
(单向散列函数,又称单向Hash函数、杂凑函数,就是把任意长度的输入消息串变化成固定长的输出串且由输出串难以得到输入串的一种函数。这个输出串称为该消息的散列值。一般用于产生消息摘要,密钥加密等。)

HMAC算法利用哈希运算,以一个密钥一个消息为输入,生成一个消息摘要作为输出。

其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,形成固定长度的认证码。

通信双方通过认证码的校验来确定报文的合法性。HMAC算法可以用来作加密、数字签名、报文验证等[2]。

HMAC使用的Hahs函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出的新的单向散列函数,也同样可以使用。

使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512[1]。其中HMAC-SHA256就是接下来要重点介绍的。

HMAC-SHA256算法原理

定义1 HMAC算法
HMAC算法的数学公式为:
HMAC ( k , m ) = H ( k’ ⊕ opad , H ( k’ ⊕ ipad, m ) )

     其中:H 为密码Hash函数(如MD5或SHA-2),能够对明文进行分组循环压缩;k 为密钥(secret key);m 为要认证的消息;k’ 是从原始密钥 k 导出的另一个密钥(如果 k 短于散列函数的输入块大小,则向右填充零;如果比该块大小更长,则对 k 进行散列)(这里用的估计就是PBKDF2)ipad 内部填充(0x5C5C5C…5C5C,一段十六进制常量);opad 外部填充(0x363636…3636,一段十六进制常量)。

HMAC的计算步骤


① 密钥处理

如果密钥比单向散列函数分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。

② 处理后的密钥与ipad进行XOR

将处理后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。XOR运算所得到的值,是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

③ 与消息组合

随后,将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

④ 计算散列值

将步骤③的结果作为单向散列函数的输入,并计算出散列值。

⑤ 处理后的密钥与opad进行XOR

将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

⑥ 与散列值组合

将步骤④的结果拼在opadkey的后面。

⑦ 计算散列值

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

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

SHA-256算法

什么是SHA-256算法?

散列函数它被认为是一种单向函数——根据函数输出的结果,极难回推输入的数据。散列函数把消息数据打乱混合,压缩成散列值(摘要),使得数据量变小。

SHA-256由美国国家安全局研发,是SHA-2下细分出的一种算法,属于SHA算法之一,是SHA-1的后继者。SHA-256(Secure Hash Algorithm 256,安全散列算法256)是散列函数(或哈希函数)的一种,对于任意长度的消息,SHA256都会产生一个256-bit(32-byte数组)的哈希值,称作消息摘要。
摘要通常用一个长度为64位的十六进制字符串来表示。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。[2]

SHA-256的算法描述

首先进行信息预处理,如下图所示,将原始消息分成若干个512-bit大小的消息块。最后一个消息块需要进行信息补全,并附上原消息的长度信息。消息被分成n块后,需要进行n次迭代,最后一次的结果就是最终的哈希值,即256bit的数字摘要。

在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit)在32位的系统中(比如win32) 1字(word)= 4字节(byte)=32(bit)在64位的系统中(比如win64)1字(word)= 8字节(byte)=64(bit)

SHA256算法的最小运算单元为“字”(word, 32-bit)。下图的256-bit的中间状态Hi被描述为8个字。

512-bit的消息块Mi将由16个字扩展为64个字,并与Hi混合,压缩成新的散列值Hi+1。

第i块数据经Map函数映射的结果,将作为第i+1块的输入,即Map(H_(i-1))=H_i。H0是预设好的hash初值(自然数中前8个质数的平方根的小数部分,取前32-bit),依次对数据进行Hash映射,得到的最后一个状态Hn便是最终的数字摘要。


而其中最关键的操作为映射函数Map,其内部相当于是一个循环加密的过程,不断将原始信息进行打乱。

HMAC-SHA256算法实现

HMAC-SHA256算法,即使用SHA-256生成哈希值的HMAC算法。

依据HMAC算法和SHA-256算法内容,可知HMAC-SHA256算法的明文分组长度B为512-bit,可通过任意长度密钥K(最小推荐长度为256-bit,一般应大于B),得出长度为256-bit散列值(摘要)。定义为:

  〖HMAC〗_SHA256 (k,m)= SHA256(k’⊕opad∥SHA256(k’⊕ipad∥m))其中:SHA256 为SHA-256加密算法,其输出散列值长度256-bit;|| 拼接操作,将两个字符串拼接在一起;B Hash函数明文分组长度,SHA-256算法中为512-bit;k 为密钥(secret key);m 为要认证的消息;k’ 是从原始密钥 k 导出的另一个密钥(若 k 短于B,则向右填充零,直到与B相同;若k长于B,则对 k 进行一次SHA256散列计算)ipad 内部填充(0x5C5C5C…5C5C,512-bit常量);opad 外部填充(0x363636…3636,512-bit常量)。

HMAC-SHA256的算法步骤

HMAC-SHA256计算步骤如下图所示:

① 密钥处理

如果密钥比SHA-256分组长度(512-bit)要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。如果密钥比SHA-256分组长度(512-bit)要长,则要用SHA-256算法求出密钥的散列值,然后将这个散列值用作HMAC的密钥。

② 处理后的密钥与ipad进行XOR

将处理后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到SHA-256分组长度(512-bit)所形成的比特序列,其中ipad的i是inner的意思。XOR运算所得到的值,是一个和SHA-256分组长度(512-bit)相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

③ 与消息组合

随后,将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

④ 计算散列值

将步骤③的结果作为SHA-256函数的输入,并计算出散列值。

⑤ 处理后的密钥与opad进行XOR

将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到SHA-256分组长度(512-bit)所形成的比特序列,其中opad的o是outer的意思。XOR运算所得到的结果也是一个和SHA-256分组长度(512-bit)相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

⑥ 与散列值组合

将步骤④的结果拼在opadkey的后面。

⑦ 计算散列值

将步骤⑥的结果输入SHA-256函数,并计算出散列值,这个散列值就是最终的摘要内容。

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

参考链接:

可搜索加密技术 - 学习笔记(二)- 预备知识:HMAC-SHA256函数
从零入门HMAC-SHA256
HMAC简介及HMAC-SHA256实现Demo

HMAC-SHA256相关推荐

  1. js怎么实现hmacsha256_各种语言HMAC SHA256实现

    语言包含: Javascript ,PHP,Java,Groovy,C#,Objective C,Go,Ruby,Python,Perl,Dart,Swift,Rust,Powershell. Jav ...

  2. Http请求加密规则(3DES、Base64、HMAC SHA256)

    Http请求加密规则(3DES.Base64.HMAC SHA256) 如果使用了Https请求,那么大多数情况下就无需双方再制定一套加密规则,所以本人讲述的是使用Http请求时,对于一些安全性较高的 ...

  3. hmacsha256 c语言源码,纯C语言实现hmac sha256,可在单片机中使用_沃航科技

    这是小沃最近遇到的一个项目,由于百度云的所有接口都需要通过hmac sha256计算,所以小沃在网上找到了相关代码可以在单片机中实现,现在就分享给大家. SHA256.h#ifndef SHA256_ ...

  4. python HMAC SHA256 加密(python3 HmacSHA256加密)

    首先保证亲测可用,代码如下:from hashlib import sha256 import hmacdef get_sign(key, data):#sha256加密有2种# hsobj = sh ...

  5. hmac sha256安全吗_全面普及HTTPS有意义吗?

    记得小时候,敞篷卡车从果园拉着一车车的苹果,运到码头上,然后再装载到万吨货轮上运往上海.但运往码头的最后一公里,道路坑坑洼洼,卡车会放慢速度,这时就会有一些青少年爬上货车,从袋子里拿苹果吃,每次都会有 ...

  6. hmac sha256 php,PHP中的HMAC-SHA-256

    我必须从这个字符串构建一个autorisation哈希: kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9- ...

  7. php hmac sha256签名,HMAC-SHA256签名错误?

    #2.连接商户key: act_name=3333321ss&client_ip=118.89.65.223&mch_billno=a0000000000000000001&m ...

  8. HMAC和密钥导出(HMAC and Key Derivation)

    简单地计算hash_func(key+msg)以获得MAC(消息认证码)被认为是不安全的.建议改用HMAC算法,例如HMAC-SHA256或HMAC-SHA3-512或其他安全MAC算法. 什么是HM ...

  9. PHP hash_hmac sha256 遇到的坑 解决PHP与JAVA sha256结果不一致

    在对接环信客服云验签时遇到一个坑,简单记录下 官方示例如下 第 2 步:根据Client Secret与待加密字符串计算signature 使用hmac-sha256加密,然后对其返回的原始二进制数据 ...

  10. jwt 私钥_一分钟带你了解JWT认证

    一.JWT简介 JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息.由于此信息是经过数字签名的,因 ...

最新文章

  1. LeetCode-笔记-523. 连续的子数组和
  2. 测试工具–super-mack
  3. Apollo后台配置:关联公共Namespace(类似与继承父类配置)
  4. Android模拟器中sd卡的创建和文件的上传
  5. 强类型的JavaScript(TypeScript)–现在没有任何理由不要深入JavaScript!
  6. Java里的阻塞队列
  7. cocos2dx windows phone平台下CCLabelTTF自己主动换行的实现
  8. 2022 年您必须关注的 8 个python数据科学神器
  9. Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)...
  10. vb计算机二级操作题考试试题,2017全国计算机二级VB考试操作题与答案
  11. Maya模型锁定不能编辑的解锁方法
  12. mysql 性能优化方向
  13. 软件集成:Simulink与STM32联合开发
  14. Windows2008环境64位操作系统如何安装32位BDE
  15. Uni-app API
  16. 790. 数的三次方根
  17. 如何处理计算机相关涉密信息的传输与保存,违反国家规定,对涉密计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,构成()。...
  18. 大数据学习计划【2019经典不断更新】
  19. MS17-010永恒之蓝漏洞利用,win32安装,windows 7 32位
  20. PS技巧:如何优雅的抠图章?

热门文章

  1. FormData表单序列化
  2. 【摄影】【夜景】拍摄注意事项
  3. 两个点 定位_基于双天线的北斗定位系统设计与实现
  4. 【数学】C019_LC_三锥形的表面积(减重叠面积)
  5. Auto CAD:CAD绘图设计以项目为导向,实战案例中图层、图块运用技巧经验总结之详细攻略
  6. Nginx resolver 解析proxy_pass中的域名
  7. xshell命令卡死
  8. python海龟绘图教程自学网_python海龟绘图实例教程
  9. 4.Licheepi Mplayer
  10. 《演出经纪人员管理办法》修订发布