HMAC 详解:在 Golang 中实现消息认证码
目录
什么是 HMAC
HMAC 的主要用途
HMAC 的工作原理
Golang 中的 crypto/hmac 包
如何选择合适的哈希函数和密钥长度
小结
什么是 HMAC
HMAC(Hash-based Message Authentication Code)是一种基于 Hash 函数和密钥的消息认证码,由 H.Krawezyk,M.Bellare,R.Canetti 于1996年提出的一种基于 Hash 函数和密钥进行消息认证的方法,并于1997年作为 RFC2104 被公布。HMAC 将密钥、消息和哈希函数一起使用,确保消息在传输过程中不被篡改,还可以验证消息的发送者身份。
HMAC 的主要用途
HMAC 主要用于以下几个方面:
- 校验数据的完整性:HMAC可以用于校验数据在传输过程中是否被篡改,接收者通过计算接收到的消息的 HMAC,与接收到的 HMAC 进行比较,如果相同的话,可以认为数据是完整的。
- 用于身份验证:HMAC 还可以用于验证消息的发送者。因为 HMAC 的计算需要一个密钥,只有知道这个密钥的人才能生成正确的 HMAC。所以,如果一个消息的 HMAC 是正确的,可以认为这个消息确实来自声称的发送者,典型的使用场景是 OpenAPI。
- 防止重放攻击:在某些情况下,HMAC 还可用于防重放攻击。在消息中添加一个时间戳或序列号,并参与 HMAC 的计算,接收者可以拒绝那些具有旧时间戳或序列号的消息,从而防止攻击者重放旧消息。
- 安全协议:HMAC 在很多安全协议中都有应用,例如 IPSec(用于保护 Internet Protocol 通信)和 TLS(用于保护 Web 通信)。这些协议使用 HMAC 来确保数据的完整性和验证发送者的身份。
HMAC 的工作原理
HMAC 的典型使用方式如下:
- 确定一个哈希函数(如 SHA256 或 MD5)和一个密钥。
- 通过将密钥和消息组合,并通过哈希函数运算,生成固定大小的数据(称为消息认证码)。
- 当消息接收者收到消息和 HMAC 时,使用同样的密钥和哈希函数对接收到的消息进行运算,然后将结果与接收到的 HMAC 进行比较,如果相同,消息就被认为是完整的且未被篡改,并且确实来自声称的发送者。
Golang 中的 crypto/hmac 包
Golang 中的 crypto/hmac 包提供了 HMAC 的实现方法。以下是 crypto/hmac 包的一些主要函数和用法:
- New 函数,接收一个哈希函数和一个密钥,返回一个用来计算 HMAC 的 hash.Hash。
h := hmac.New(sha256.New, key)
- Write 方法,可以向 HMAC 添加数据,实现了 io.Writer 接口。
_, err := h.Write(data)
if err != nil {log.Fatal(err)
}
- Sum 方法,返回当前的哈希值作为字节切片。可以选择提供一个已存在的字节切片,哈希值会被追加到这个切片的末尾。
result := h.Sum(nil)
- Equal 函数,用于比较两个 HMAC 是否相等,这个函数可以防止 timing attack 类型的攻击(使用相同的时间来进行比较)。
isValid := hmac.Equal(mac1, mac2)
可以看出Equal函数并不是简单地使用`==`运算符来比较两个 HMAC 值,而是使用了一种叫做"constant time comparison"的技术来做比较。这种技术可以确保比较花费的时间不依赖比较的数据,从而防止 timing attack 类型的攻击。攻击者通过计算比较操作花费的时间,可以推断出一些关于数据的信息。例如,如果比较操作花费的时间和字节数有某种关系,攻击者就可以通过改变输入,观察比较操作花费时间的变化,从而推断出正确的 HMAC 值。
以下是一个使用 crypto/hmac 包生成 HMAC 的例子,代码如下:
package mainimport ("crypto/hmac""crypto/sha256""fmt"
)func main() {key := []byte("secret key")data := []byte("message to authenticate")h := hmac.New(sha256.New, key)_, err := h.Write(data)if err != nil {fmt.Println("Error writing to HMAC:", err)return}result := h.Sum(nil)fmt.Printf("HMAC: %x\n", result)
}
这个例子是使用 SHA-256 作为底层的哈希函数,但也可以使用任何实现了 hash.Hash 接口的哈希函数。
如何选择合适的哈希函数和密钥长度
选择 HMAC 的哈希函数和密钥长度时,需要考虑以下几个因素:
- 安全需求:安全需求是决定哈希函数和密钥长度选择的最重要因素。如果需要更高的安全性,应该选择更强大的哈希函数和更长的密钥。例如,SHA-256 或 SHA-3。
- 性能需求:更强大的哈希函数和更长的密钥通常会更耗性能。如果系统对性能有严格的要求,可能需要在安全性和性能之间做出权衡。
- 兼容性:如果系统需要与其他系统交互,可能需要选择一个与其他系统兼容的哈希函数和密钥长度。
关于哈希函数,应该选择一个被广泛接受并且经过了严格安全检验的哈希函数。SHA-256 是被广泛接受的一种哈希算法,不仅提供了足够的安全性,并且在大多数现代硬件上都有很好的性能。
关于密钥长度,一般来说,密钥的长度应该至少与哈希函数的输出长度相同。例如,如果使用了 SHA-256,那么密钥长度应该至少为256位。如果密钥太短,可能会降低 HMAC的安全性。如果密钥太长,浪费服务器资源不说,也不会进一步提高 HMAC 的安全性。所以,选择一个与哈希函数输出长度相同的密钥长度是一个好的选择。
小结
本文详细讲解了如何在 Golang 中实现 HMAC,首先介绍了 HMAC 的基本概念和用途。然后详细讲解了 HMAC 的工作原理,包括如何选择哈希函数和密钥。希望能帮助你理解和有效使用 HMAC 来提高程序的全性。
相关文章:
HMAC 详解:在 Golang 中实现消息认证码
目录 什么是 HMAC HMAC 的主要用途 HMAC 的工作原理 Golang 中的 crypto/hmac 包 如何选择合适的哈希函数和密钥长度 小结 什么是 HMAC HMAC(Hash-based Message Authentication Code)是一种基于 Hash 函数和密钥的消息认证码,由 H.Kr…...

阻塞队列和定时器的使用
阻塞队列 谈到队列,大家就能想到队列的先进先出原则,但有些特殊的队列,虽然也是先进先出的,但是带有阻塞功能,我们把这种队列叫做阻塞队列. ★如果队列为空,执行出队操作就会阻塞,阻塞到另外一个线程往队列里添加元素(队列不为空)为止. ★如果队列满了,执行入队操作时,也会阻…...

JavaScript脚本操作CSS
脚本化CSS就是使用JavaScript脚本操作CSS,配合HTML5、Ajax、jQuery等技术,可以设计出细腻、逼真的页面特效和交互行为,提升用户体验,如网页对象的显示/隐藏、定位、变形、运动等动态样式。 1、CSS脚本化基础 CSS样式有两种形式&…...
Rust4.1 Managing Growing Projects with Packages, Crates, and Modules
Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 7: Managing Growing Projects with Packages, Crates, and Modules src/main.rs // s…...
RPA在财务预测和分析中的应用
在现代企业管理中,财务数据分析是决策制定和战略规划的关键环节。大数据的兴起带来财务数据的复杂性和数量不断增加,企业为此消耗了大量人力和物力。随着当今数字化、智能化时代的到来,越来越多企业引进RPA技术来提高工作效率,实现…...

无人机航拍技术基础入门,无人机拍摄的方法与技巧
一、教程描述 买了无人机,可是我不敢飞怎么办?禁飞区越来越多,到底哪儿才能飞?我的无人机跟你一样,为什么我拍不出大片?厂家的说明书看不进去,有没有一套无人机的课程,可以快速上手…...
PTA 哈密尔回路(建图搜索)
题目 著名的“汉密尔顿(Hamilton)回路问题”是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次)。本题就要求你判断任一给定的回路是否汉密尔顿回路。 输入格式: 首先第一行给出两个正整数:…...

如何利用产品帮助中心提升用户体验
在当今竞争激烈的市场中,提供优秀的用户体验是吸引和保留客户的关键。而一个高效和易于使用的产品帮助中心,正成为越来越多企业用以提升用户体验的重要工具。产品帮助中心是一个集中的信息库,为用户提供关于产品功能、故障排除、常见问题解答…...

【Python大数据笔记_day05_Hive基础操作】
一.SQL,Hive和MapReduce的关系 用户在hive上编写sql语句,hive把sql语句转化为MapReduce程序去执行 二.Hive架构映射流程 用户接口: 包括CLI、JDBC/ODBC、WebGUI,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端…...

css呼吸效果实现
实现一个图片有规律的大小变化,呈现呼吸效果,怎么用CSS实现这个呼吸效果呢 一.实现 CSS实现动态效果可以使用动画( animation)来属性实现,放大缩小效果可以用transform: scale来实现,在这基础上有了动画,就可以设置一个…...

机器视觉opencv答题卡识别系统 计算机竞赛
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 答题卡识别系统 - opencv python 图像识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分…...
2024年的后端和Web开发趋势
目录 1 2 3 4 5 1 不断变化的数字创新格局可能让人感觉像是一场无情的竞赛。作为开发人员,你的痛苦是真实的——交付尖端产品、保持竞争力、跟上不断变化的用户期望,综合起来你的压力可能是压倒性的。 但是,如果我们告诉你有一个指南针…...

对比了10+网盘资源搜索工具,我最终选择了这款爆赞的阿里云盘、百度网盘、夸克网盘资源一站式搜索工具
盘友圈(https://panyq.com)是一个综合性的网盘搜索站,与其他网盘搜索工具相比,它具有多个独特的优点,使其成为用户们首选的平台。 首先,盘友圈汇集了阿里云盘、百度网盘和夸克网盘等主流网盘资源ÿ…...

GoLong的学习之路(二十)进阶,语法之反射(reflect包)
这个是为了接上之前的语法篇的。按照我的学习计划,这里此时应该有一个小项目来做一个统合。但是吧,突然觉得,似乎也没必要。能学go的大部分肯定都是有其他语言的基础的。 接下来说反射 文章目录 反射介绍reflect包TypeOftype name和type kin…...
关于表单校验,:rules=“loginRules“
在写好validator相关的方法后,rule测试没有生效 <el-form ref"loginForm" :model"loginForm" :rules"loginRules" class"login-form" <el-form-item prop"username"> <el-input ref"usernam…...

统一消息分发中心设计
背景 我们核心业务中订单完成时,需要完成后续的连带业务,扣件库存库存、增加积分、通知商家等。 如下图的架构: 这样设计出来导致我们的核心业务和其他业务耦合,每次新增连带业务或者去掉连带业务都需要修改核心业务。 一方面&…...

前端项目导入vue和element
1.安装nodejs 下载链接https://cdn.npmmirror.com/binaries/node/v18.18.0/node-v18.18.0-x64.msi 进入cmd 命令行模式 管理员身份运行 输入 (node -v)能看到版本号 npm config set prefix "C:\Program Files\nodejs" 默认路径 npm config…...

【11】使用透视投影建立一个3D空间的测试
核心操作: 1.proj view model 这三个矩阵 glm::mat4 mvp m_Proj * m_View * model; m_Shader->Bind(); m_Shader->SetUniformMat4f("u_MVP", mvp);着色器里面就: proj:投影矩阵,可以选择正交投影,或者透视投影…...

【广州华锐互动】VR影视制片虚拟仿真教学系统
随着虚拟现实(VR)技术的不断发展,VR在影视制片教学中的应用场景也变得越来越丰富。本文将介绍VR在影视制片教学中的常见应用场景及其意义,并通过案例分析来更好地展示其应用前景。 在影视制片教学中,VR可以提供一种沉浸式的制作体验。其中&am…...

从研发域到量产域的自动驾驶工具链探索与实践
导读 本文整理自 2023 年 9 月 5 日百度云智大会 - 智能汽车分论坛,百度智能云自动驾驶云研发高级经理徐鹏的主题演讲《从研发域到量产域的自动驾驶工具链探索与实践》。 全文中部段落附有演讲中 2 个产品演示视频的完整版,精彩不容错过。 (视频观看&…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...