HMAC算法及其应用
MAC
在现代的网络中,身份认证是一个经常会用到的功能,在身份认证过程中,有很多种方式可以保证用户信息的安全,而MAC(message authentication code)就是一种常用的方法。
消息认证码是对消息进行认证并确认其完整性的技术。通过使用发送者和接收者之间共享的密钥,就可以识别出是否存在伪装和篡改行为。
MAC是通过MAC算法+密钥+要加密的信息一起计算得出的。
同hash算法(消息摘要)相比,消息摘要只能保证消息的完整性,即该消息摘要B是这个消息A生成的。而MAC算法能够保证消息的正确性,即判断确实发的是消息A而不是消息C。
同公私钥体系相比,因为MAC的密钥在发送方和接收方是一样的,所以发送方和接收方都可以来生成MAC,而公私钥体系因为将公钥和私钥分开,所以增加了不可抵赖性。
MAC有很多实现方式,比较通用的是基于hash算法的MAC,比如今天我们要讲的HMAC。还有一种是基于分组密码的实现,比如(OMAC, CBC-MAC and PMAC)。
HMAC
HMAC 是Keyed-Hashing for Message Authentication的缩写。HMAC的MAC算法是hash算法,它可以是MD5, SHA-1或者 SHA-256,他们分别被称为HMAC-MD5,HMAC-SHA1, HMAC-SHA256。
HMAC用公式表示:
H(K XOR opad, H(K XOR ipad, text))
其中
H:hash算法,比如(MD5,SHA-1,SHA-256)
B:块字节的长度,块是hash操作的基本单位。这里B=64。
L:hash算法计算出来的字节长度。(L=16 for MD5, L=20 for SHA-1)。
K:共享密钥,K的长度可以是任意的,但是为了安全考虑,还是推荐K的长度>B。当K长度大于B时候,会先在K上面执行hash算法,将得到的L长度结果作为新的共享密钥。 如果K的长度<B, 那么会在K后面填充0x00一直到等于长度B。
text: 要加密的内容
opad:外部填充常量,是 0x5C 重复B次。
ipad: 内部填充常量,是0x36 重复B次。
XOR: 异或运算。
计算步骤如下:
- 将0x00填充到K的后面,直到其长度等于B。
- 将步骤1的结果跟 ipad做异或。
- 将要加密的信息附在步骤2的结果后面。
- 调用H方法。
- 将步骤1的结果跟opad做异或。
- 将步骤4的结果附在步骤5的结果后面。
- 调用H方法。
HMAC的应用
hmac主要应用在身份验证中,如下是它的使用过程:
- 客户端发出登录请求(假设是浏览器的GET请求)
- 服务器返回一个随机值,并在会话中记录这个随机值
- 客户端将该随机值作为密钥,用户密码进行hmac运算,然后提交给服务器
- 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法。
在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的hmac结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使hmac只在当前会话中有效,大大增强了安全性和实用性。
HMAC实现举例
/*
** Function: hmac_md5
*/
void
hmac_md5(text, text_len, key, key_len, digest)
unsigned char* text; /* pointer to data stream */
int text_len; /* length of data stream */
unsigned char* key; /* pointer to authentication key */
int key_len; /* length of authentication key */
caddr_t digest; /* caller digest to be filled in */
{
MD5_CTX context;
unsigned char k_ipad[65]; /* inner padding -
* key XORd with ipad
*/
unsigned char k_opad[65]; /* outer padding -
* key XORd with opad
*/
unsigned char tk[16];
int i;
/* if key is longer than 64 bytes reset it to key=MD5(key) */
if (key_len > 64) {
MD5_CTX tctx;
MD5Init(&tctx);
MD5Update(&tctx, key, key_len);
MD5Final(tk, &tctx);
key = tk;
key_len = 16;
}
/*
* the HMAC_MD5 transform looks like:
*
* MD5(K XOR opad, MD5(K XOR ipad, text))
*
* where K is an n byte key
* ipad is the byte 0x36 repeated 64 times
* opad is the byte 0x5c repeated 64 times
* and text is the data being protected
*/
/* start out by storing key in pads */
bzero( k_ipad, sizeof k_ipad);
bzero( k_opad, sizeof k_opad);
bcopy( key, k_ipad, key_len);
bcopy( key, k_opad, key_len);
/* XOR key with ipad and opad values */
for (i=0; i<64; i++) {
k_ipad[i] ^= 0x36;
k_opad[i] ^= 0x5c;
}
/*
* perform inner MD5
*/
MD5Init(&context); /* init context for 1st
* pass */
MD5Update(&context, k_ipad, 64) /* start with inner pad */
MD5Update(&context, text, text_len); /* then text of datagram */
MD5Final(digest, &context); /* finish up 1st pass */
/*
* perform outer MD5
*/
MD5Init(&context); /* init context for 2nd
* pass */
MD5Update(&context, k_opad, 64); /* start with outer pad */
MD5Update(&context, digest, 16); /* then results of 1st
* hash */
MD5Final(digest, &context); /* finish up 2nd pass */
}
更多精彩内容且看:
- 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
- Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
- Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
- java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程
更多教程请参考flydean的博客
相关文章
- 【经典算法】直接选择排序
- 软件开发与算法在计算机中的应用
- Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
- Java实现 蓝桥杯VIP 算法提高 P0402
- Java实现 蓝桥杯VIP 算法训练 传球游戏
- Java实现 蓝桥杯VIP 算法训练 薪水计算
- Java实现 蓝桥杯VIP 算法训练 最大值与最小值的计算
- 一致性哈希算法及其在分布式系统中的应用(转)
- (算法)并查集及其应用
- 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]
- 【前缀和算法】一维前缀和、二维前缀和算法介绍及其应用
- XAI之ALE:ALE累积局部效应图可视化算法的简介(原理/意义/优缺点/应用)、常用工具包、案例应用之详细攻略
- CV之IS:基于pixellib库和coco数据集且加载.h5文件利用Mask RCNN算法实现图像实例分割简单代码全实现(以热播电视剧《庆余年》视频片段为例)案例应用
- DL之DeepLabv2:DeepLab v2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之Attention:Attention注意力机制算法的起源与盛行及其长距离有效的原因、概述(背景/本质/与ED框架关系/架构/优缺点/扩展,理解,本质,变种)、案例应用(CV/NLP)之详细攻略
- DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介、应用、经典案例之详细攻略
- DL之AlexNet:AlexNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之ResNeXt:ResNeXt算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 【优化算法】回溯搜索优化算法及其应用(BSA)(Matlab代码实现)
- 【负荷预测】基于蚂蚁优化算法的BP神经网络在负荷预测中的应用研究(Matlab完整代码实现)
- 【回归预测-BP预测】基于思维进化算法优化BP神经网络在非线性函数拟合中的应用(Matlab代码实现)
- 【鲁棒优化、大M法、C&CG算法】计及风、光、负荷不确定性两阶段鲁棒优化(Matlab代码实现)
- 【无线通信】鲸鱼优化算法及其在无线网络资源分配中的应用(Matlab代码实现)
- m基于matlab的软件无线电注水功率分配算法性能仿真,对比C-PF,C-CUBP,C-DUBP等
- 智能优化算法应用:基于GWO优化的Renyi熵图像多阈值分割 - 附代码
- 智能优化算法应用:基于灰狼算法的Otsu图像多阈值分割-附代码
- 算法6-6:哈希表应用之字典应用
- 【ML吴恩达】4 回归模型的分类、应用以及九个回归算法
- 基于多领导者智能体的Olfati算法matlab仿真