HMAC算法详解

news2024/11/15 23:21:38

1.HMAC算法

1.1 HMAC算法简介

HMAC(Hash-based Message Authentication Code,散列消息认证码)是一种使用密码散列函数,同时结合一个加密密钥,通过特别计算方式之后产生的消息认证码(MAC)。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证。
HMAC算法 是一种基于密钥的报文完整性的验证方法。HMAC算法利用哈希运算,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。HMAC算法可以用来作加密、数字签名、报文验证等。

1.2 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 进行散列)
ipad 内部填充(0x5C5C5C…5C5C,一段十六进制常量);
opad 外部填充(0x363636…3636,一段十六进制常量)

1.3 HMAC算法步骤

HMAC算法加密步骤如图1所示:
在这里插入图片描述

a) 在密钥k后面添加0,或者对密钥k用H(Hash函数)进行处理,创建一个字长为B的字符串(B为Hash函数的明文分组长度);
b) 将上一步生成的B字长的字符串ipad做异或运算;
c)将数据流m填充至第二步的结果字符串中;
d)用H作用于第三步生成的数据流;
e)将第一步生成的B字长字符串与opad做异或运算;
f)再将第四步的结果填充进第五步的结果中;
g)用H作用于第六步生成的数据流,输出最终结果。

2. SHA-256算法

2.1 SHA-256算法简介

SHA-256(Secure Hash Algorithm 256,安全散列算法256)是散列函数(或哈希函数)的一种,能对一个任意长度(按bit计算)的数字消息(message),计算出一个32个字节长度的字符串(又称消息摘要,message digest)。散列函数它被认为是一种单向函数——根据函数输出的结果,极难回推输入的数据。散列函数把消息数据打乱混合,压缩成散列值(摘要),使得数据量变小。
SHA-256由美国国家安全局研发,是SHA-2下细分出的一种算法,属于SHA算法之一,是SHA-1的后继者。对于任意长度的消息,SHA256都会产生一个256-bit(32-byte数组)的哈希值,称作消息摘要。摘要通常用一个长度为64位的十六进制字符串来表示。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。

2.2 SHA-256算法描述

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

在这里插入图片描述

SHA256算法的最小运算单元为“字”(word, 32-bit)。图3中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,其内部相当于是一个循环加密的过程,不断将原始信息进行打乱。

2.3 SHA-256算法步骤

如表1所示,SHA256散列函数中涉及的操作全部是按位进行的逻辑运算。
在这里插入图片描述

设原始消息为M,原始消息长度LM,消息块Mi,哈希初值H0,SHA-256常量K[0]~K[63](自然数中前64个质数的立方根的小数部分,取前32-bit)。则SHA-256算法的加密步骤具体如下:
a) 消息(M)预处理。在消息末尾进行添加一位“1”和t位“0”,使得:
(L_M+t+1) mod 512=448,0≤t<512
将LM表示为64位大端存储格式,并添加到M末尾,组成新的消息M^’;
b) 分解。将M^'按照每块512-bit大小分解为Mi;
c) 拓展Mi到64字:W[0]~W[63]。将Mi分解为16个32-bit的大端存储的字(word),存为W[0], …, W[15],其余字由以下公式得到:
W_t=σ_1 (W_(t-2))+W_(t-7)+σ_0 (W_(t-15))+W_(t-16)
d) 迭代。进行64次加密循环即可完成一次迭代。加密过程如图4所示:ABCDEFGH这8个字最开始分别是8个哈希初值,之后按照图示规则进行更新;深蓝色方块是事先定义好的非线性逻辑函数;红色方块代表加法(若结果大于232,则进行一次mod 232运算);Kt为SHA-256常量,Wt为本区块产生第t个word,0≤t<64;最后一次循环所产生的八段字符串合起来即是此区块对应到的散列字符串;
5) 若原消息包含数个区块,则最后还要将这些区块产生的散列字符串加入迭代才能产生最后的散列字符串。

在这里插入图片描述

3. HAMAC-SHA256算法定义

3.1 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常量)

3.2 HMAC-SHA256算法步骤

HMAC-SHA256算法加密步骤如图5所示:
①. 密钥填充。若密钥比SHA-256算法的分组长度B(512-bit)短,则需在末尾填充0,直到其长度达到单向散列函数的分组长度为止。若密钥比分组长度长,则要用SHA-256算法求出密钥的散列值,然后将这个散列值作为新的密钥;
②. 内部填充。将填充后的密钥与被称为ipad的序列进行异或运算,所形成的值为ipadkey。ipad是将00110110这一序列不断循环反复直到达到分组长度;
③. 与消息组合。将ipadkey与消息组合,也就是将ipadkey附加在消息的开头。
④. 计算散列值。将3的结果输入SHA-256函数,并计算出散列值。
⑤. 外部填充。将填充后的密钥与被称为opad的序列进行异或运算,所形成的值为opadkey。opad是将01011100这一序列不断循环反复直到达到分组长度。
⑥. 与散列值组合。将4的散列值拼在opadkey后面。
⑦. 计算散列值。将6的结果输入SHA-256函数,并计算出散列值,这个散列值就是最终的摘要内容。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言使用中遇到的错误

Go语言使用中遇到的错误 1、go: go.mod file not found in current directory or any parent directory. 先运行这一行代码&#xff1a; go mod init name再运行你的 go get 命令就好了。 2、Failed to build the application: main.go:4:2: package generateproject/route…

C++之报错:is an inaccessible base of(一百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

物业管理变牛的好办法,新手零基础必备!

随着城市化进程的加速和商务发展的蓬勃&#xff0c;写字楼作为商业活动的核心场所&#xff0c;在现代都市生活中扮演着至关重要的角色。 随之而来的安全威胁和管理难题也日益凸显。因此&#xff0c;为了确保写字楼内部的安全与秩序&#xff0c;提高工作人员和访客的出入效率&am…

slab 内存池的设计与实现

目录 从一个简单的内存页开始聊 slab slab 的总体架构设计 slab 的组织架构 ​编辑 ​编辑 参考文献 伙伴系统内存分配原理的相关内容来看&#xff0c;伙伴系统管理物理内存的最小单位是物理内存页 page。也就是说&#xff0c;当我们向伙伴系统申请内存时&#xff0c;至少…

Windows:prometheus + grafana + wmi_exporter+ 主机信息监控页面 + 支持主机信息告警

1、PrometheusGrafana环境搭建 1.1、Prometheus 下载地址&#xff1a;Download | Prometheus 选择对应的系统的版本下载并解压压缩包&#xff0c;运行程序 本人在window系统上操作 双击 验证 浏览器输入http://localhost:9090/ 点击Staatus>Targets 出现以下即成功 1.…

Unifying Large Language Models and Knowledge Graphs: A Roadmap

5.2 LLM-augmented KG Completion 知识图谱补全(KGC)是指对给定知识图谱中缺失的事实进行推断的任务。与KGE类似,传统的KGC方法主要关注于KG的结构,而没有考虑广泛的文本信息。然而,最近llm的集成使KGC方法能够对文本进行编码或生成事实,以获得更好的KGC性能。这些方法根据…

【数据科学赛】2023大模型应用创新挑战赛 #¥10万 #百度

CompHub 主页增加了“近两周上新的奖金赛”&#xff0c;更加方便查找最新比赛&#xff0c;欢迎访问和反馈&#xff01; 以下内容摘自比赛主页&#xff08;点击文末阅读原文进入&#xff09; Part1赛题介绍 题目 2023大模型应用创新挑战赛 举办平台 Baidu AI Studio 主办方…

git介绍和使用

目录 一、git概述 1、简介 2、下载安装 二、git代码托管服务 1、常用的 Git 代码托管服务 2、使用码云代码托管服务 三、git常用命令 1、git全局设置 2、获取git仓库 3、工作区、暂存区、版本库 概念 4、Git工作区中文件的状态 5、本地仓库操作 6、远程仓库操作 …

Jetson Nano介绍

1. bo1公版介绍 Jetson NanoBO1公版的实物图如下图所示。其中1是TF卡接口&#xff0c;可以进行系统镜像烧写&#xff1b;2是40PIN GPIO扩展接口&#xff1b;3是用来传输数据或使用电源供电的Micro USB接口&#xff1b;4是千兆以太网口&#xff1b;5是USB3.0接口&#xff1b;6是…

CentOS Linux的替代品(五)_BigCloud Enterprise Linux for Euler 21.10 U 3基础安装教程

文章目录 CentOS Linux的替代品&#xff08;五&#xff09;_BigCloud Enterprise Linux for Euler 21.10 U 3基础安装教程一、BC-Linux简介二、BigCloud Enterprise Linux for Euler 21.10U3基础安装2.1 下载地址2.2 安装过程 三、简单使用3.1 关闭selinux3.1.1 临时关闭selinu…

QT学习笔记:QT的信号与槽

一、信号与槽&#xff08;Signal & Slot&#xff09;的基本概念 1、了解信号与槽 &#xff08;1&#xff09;信号&#xff08;Signal&#xff09;&#xff1a;在特定情况下被发射的事件&#xff0c;例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号&…

Pytest测试框架快速搭建

一、介绍 pytest是一个非常成熟的Python测试框架&#xff0c;能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequests&#xff09;&#xff1b;pytest具有很多第三方插件&#xff0c;并且可…

springboot整合腾讯企业邮箱/企业微信邮箱

springboot整合腾讯企业邮箱/企业微信邮箱 登录后点击“客户端设置” 2.勾选红框中选项并保存 3.点击微信绑定并绑定微信 4.绑定微信后点击生成新密码并保存(复制生成的密码后面会使用) 5.将配置复制到代码中 <dependency><groupId>com.sun

凤凰架构阅读记录-三(分布式算法)

1.Paxos 世界上只有一种共识协议&#xff0c;就是 Paxos&#xff0c;其他所有共识算法都是 Paxos 的退化版本。 算法流程: 1.提案节点&#xff1a;称为 Proposer&#xff0c;提出对某个值进行设置操作的节点&#xff0c;设置值这个行为就被称之为提案&#xff08;Proposal&a…

【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率)

【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率) 目录 【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率) 一、 K-NN 简介 二、K-NN 分类 三、K-NN 分类实例 1、1-NN 分类 : 此时 A 类别…

leetcode 859. Buddy Strings(同伴字符串)

给出字符串s 和 goal, 判断交换 s 中的一对字母是否能得到goal. 必须是不同位置字母的交换。 思路&#xff1a; 先考虑边界情况&#xff0c; s 和 goal 的长度不相等时&#xff0c;s 怎么交换都不会得到goal. s 的长度 < 2时&#xff0c;没有可交换对象&#xff0c;肯定是…

【力扣】94、二叉树的中序遍历

94、二叉树的中序遍历 注&#xff1a;二叉树的中序遍历&#xff1a;左根右&#xff1b; // 非递归&#xff1a; var inorderTraversal function (root) {const arr [];//创建新数组&#xff1b;const stack [];//创建一个栈道&#xff1b;let o root;while( stack.length |…

办公实现降本增效,可借助微服务开源平台的力量!

在如今的快节奏发展时代&#xff0c;低代码开发平台拥有了一个广阔的发展天地&#xff0c;逐渐在通信业、医疗、物流、高校等众多大中型企业中获得一个立足之地&#xff0c;是助力企业提质、降本、增效的得力助手。微服务开源平台可以让企业实现这一目的&#xff0c;那么对于企…

AMBER分子动力学能量优化与分析、结合自由能计算专题

AMBER分子动力学能量优化与分析、结合自由能计算专题 第一天 时间:AM9:00~9:50 内容:六.分子动力学入门理/论 教学目标&#xff1a;了解本方向内容、理论基础、研究意义。 主要知识点:4分子力学简介 4.1分子力学的基本假设 4.2分子力学的主要形式 5分子力场 5.1分子力场的简…

passware kit forensic使用

一、从外部注册表文件提取密码 适用于不联网的情况下&#xff0c;例如2023盘古石杯的NAS取证 找到Windows/System32/config并在本地打开 将路径填充到config folder中 跑出来了John电脑对应的密码是paofen&#xff0c;NAS的密码是P88w0rd 后续遇见再补