奇妙的安全旅行之HMAC算法

hi,大家好,今天我们开始介绍消息摘要算法中的HMAC(Keyed-Hashing for Message Authentication)消息认证码算法,MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥,因此MAC算法也经常被称作 HMAC 算法。

MAC

在开始之前,我们先说下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 算法首先它是基于信息摘要算法的。目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。

HMAC 算法除了需要信息摘要算法外,还需要一个密钥。HMAC的密钥可以是任何长度,如果密钥的长度超过了摘要算法信息分组的长度,则首先使用摘要算法计算密钥的摘要作为新的密钥。一般不建议使用太短的密钥,因为密钥的长度与安全强度是相关的。通常选取密钥长度不小于所选用摘要算法输出的信息摘要的长度。

MD 算法的对比

算法摘要长度(bit)实现方
HmacMD5128JDK、Bouncy Castle、Commons Codec
HmacSHA1160JDK、Bouncy Castle、Commons Codec
HmacSHA224224JDK、Bouncy Castle、Commons Codec
HmacSHA256256JDK、Bouncy Castle、Commons Codec
HmacSHA384384JDK、Bouncy Castle、Commons Codec
HmacSHA512512JDK、Bouncy Castle、Commons Codec

HMAC 算法实现

JDK 的 HMAC 算法实现

JDK 关于HMAC算法的实现:

// 获取 HMAC Key
public static byte[] getHmacKey(String algorithm) {try {// 1、创建密钥生成器KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);// 2、产生密钥SecretKey secretKey = keyGenerator.generateKey();// 3、获取密钥byte[] key = secretKey.getEncoded();// 4、返回密钥return key;} catch (Exception e) {throw new RuntimeException(e);}
}// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {try {// 1、还原密钥SecretKey secretKey = new SecretKeySpec(key, algorithm);// 2、创建MAC对象Mac mac = Mac.getInstance(algorithm);// 3、设置密钥mac.init(secretKey);// 4、数据加密byte[] bytes = mac.doFinal(data);// 5、生成数据String rs = encodeHex(bytes);// 6、返回十六进制加密数据return rs;} catch (Exception e) {throw new RuntimeException(e);}
}
Bouncy Castle 的HMAC 算法实现

Bouncy Castle 关于HMAC算法的实现:

// 获取 HMAC Key
public static byte[] getHmacKey(String algorithm) {try {// 1、创建密钥生成器KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);// 2、产生密钥SecretKey secretKey = keyGenerator.generateKey();// 3、获取密钥byte[] key = secretKey.getEncoded();// 4、返回密钥return key;} catch (Exception e) {throw new RuntimeException(e);}
}// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {HMac hmac = generateHmacByAlgorithm(algorithm);KeyParameter keyParameter = new KeyParameter(key);hmac.init(keyParameter);hmac.update(data, 0, data.length);byte[] rsData = new byte[hmac.getMacSize()];hmac.doFinal(rsData, 0);return Hex.toHexString(rsData);
}
Commons Codec 的HMAC 算法实现

Commons Codec 提供的 HMAC 算法实现:

// 获取 HMAC Key
public static byte[] getHmacKey(String algorithm) {try {// 1、创建密钥生成器KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);// 2、产生密钥SecretKey secretKey = keyGenerator.generateKey();// 3、获取密钥byte[] key = secretKey.getEncoded();// 4、返回密钥return key;} catch (Exception e) {throw new RuntimeException(e);}
}// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {Mac mac = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_MD5, key);return Hex.encodeHexString(mac.doFinal(data));
}

获取完整代码请访问:

https://github.com/ForTheDevelopers/JavaSecurity

HMAC 算法的应用

1、可以验证对端用户的合法性

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

(1) 先由客户端向服务器发出一个验证请求,(假设是浏览器的GET请求)。

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

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

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

在这个过程中,可能遭到安全攻击的是服务器发送的随机数和客户端返回的HMAC结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,随机值的引入使HMAC只在当前会话中有效,大大增强了安全性和实用性。

2、发消息给对方(或从对方接收消息)

比如你和对方共享了一个密钥K,现在你要发消息给对方,既要保证消息没有被篡改(完整性),又要能证明信息确实是你本人发的(源认证),那么就把原信息和密钥K经 HMAC 计算的值一起发过去。对方接到之后,使用自己手中的密钥K和原消息计算一下HMAC的值,如果和你发送的HMAC一致,那么可以认为这个消息既没有被篡改也没有冒充。

普通散列算法和HMAC算法的区别

普通散列算法就是通过hash对要输出的数据进行摘要,接收到数据时,再同样对源数据进行散列,与给定的散列值比较,看收到的数据与计算的hash值是否一致就可以了。

通常来说,传输的数据和散列值是不同的渠道给出的,比如网页上显示MD5或SHA的散列值,但是下载链接是某个镜像网站的,这并不影响你下载到的文件的正确性。

如果要通过同一个渠道发送数据和散列值的话(比如消息认证码),就要考虑数据和散列值是否会同时被篡改的问题,如果第三方修改了数据,然后进行MD5散列,并一块发给接收方,接收方并不能察觉到数据被篡改。

而HMAC算法就可以用一把发送方和接收方都有的密钥key进行计算,而没有这个密钥key的第三方是无法计算出正确的散列值的,这样就可以防止数据的来源方被篡改。

总结

HMAC算法目前的应用场景相对还比较少,通常会直接使用加密算法来保证来源方的正确性,不过HMAC在特定场景下还是有一定用途的,大家可以根据自己的业务特点来选择使用哪种加密算法。另外也欢迎大家关注我们的公众号,回复【加解密】获取本系列的全部源码。

创作不易,如果大家喜欢本文,欢迎点赞,转发,你的关注是我们继续前进的动力_

欢迎大家关注「我是开发者FTD」公众号,微信号:ForTheDevelopers

也欢迎大家添加我的个人微信交流,微信号:ForTheDeveloper

关注开发,更关注开发者!

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

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

相关文章

expdp导出表结构_(转)oracle使用expdp、impdp和exp、imp导入导出表及表结构

使用expdp、impdp和exp、imp时应该注重的事项:1、exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。2、expdp和impdp是服务端的工具程序,他们只能在oracle服务端使用,不能在客户端使用。3、imp只…

奇妙的安全旅行之DES算法(一)

hi,大家好,从今天开始我们介绍加密算法中的对称加密算法。相信大家看了前几篇文章,已经对摘要算法的使用已经有了比较深的认识,摘要算法由于其算法特性,只能单向加密,无法对数据反向解密,这时对…

dockerfile拉取私库镜像_还在用Alpine作为你Docker的Python开发基础镜像?其实Ubuntu更好一点...

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_173一般情况下,当你想为你的Python开发环境选择一个基础镜像时,大多数人都会选择Alpine,为什么?因为它太小了,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接…

2020,再见;2021,我来了!

现在是2021年1月16日下午16点33分,星期六。此时北京正在通报昨日新冠肺炎新增病例情况,这种每天戴口罩的鬼日子还不知道什么时候能结束。最近由于天气变冷,病毒更容易存活和传播,最近一个月就突然又变的非常紧张起来了&#xff0c…

cuda tensorflow版本对应_Windows10下安装tensorflow-gpu(2.2.0)安装教程(避坑+保姆式教学)...

本文实现了Windows10下GPU版本的tensorflow2.2.0的安装,用到的软件主要包括:CUDA 10.2 cuDNN Anaconda tensorflow-gpu 2.2.0。(注:此教程在Win7环境下也同样适用!另附报错缺少cudart64_101.dll的解决办法&#xff…

奇妙的安全旅行之DES算法(二)

hi,大家好,上一节我们详细介绍了对称加密算法DES的基本内容,由于明文的长度不固定,而加密算法只能处理特定长度的一块数据,所以就需要对比较长的明文进行分组后再加密,但是分组后,最后一组的长度…

c++创建虚拟串口_linux虚拟串口控制器驱动实现——适用于无开发板学习串口驱动...

在上一章我们已经说明了uart驱动的开发流程,本章我们就不再介绍uart相关的接口实现,仅通过实现一个虚拟的串口控制器程序,用以说明虚拟串口的开发流程。本次开发的虚拟串口提供的功能如下:提供两个串口实例串口名称的前缀为vttyU为…

奇妙的安全旅行之AES算法

hi,大家好,今天开始我们来介绍一下对称加密算法中的AES算法。 AES简介 AES(英语:Advanced Encryption Standard,缩写:AES),即高级加密标准,在密码学中又称Rijndael加密…

axios vue 回调函数_前端Vue 面试题大全

点蓝色字关注“程序员报刊” 「学习 新闻 招聘 」vue的底层原理?vue组件之间的通信?JS中判断数据类型的方法有几种?最常见的判断方法:typeof判断已知对象类型的方法:instanceof根据对象的constructor判断:constructor无敌万能的…

奇妙的安全旅行之RSA算法

hi,大家好,我是开发者FTD。今天我们开始介绍非对称加密算法。非对称加密算法区别于对称加密算法的主要特点是,非对称加密算法有两个密钥:公钥 (public key) 和私钥 (private key)。公钥和私钥是一对密钥,如果用公钥对数…

易语言多级指针读取_C语言指针难吗?纸老虎而已,纯干货讲解(附代码)

作者:21IC网络整理,排版:晓宇微信公众号:芯片之家(ID:chiphome-dy)指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面…

奇妙的安全旅行之DSA算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法中的DSA算法。 DSA 算法简介 DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard) 数字签…

lisp语言画阿基米德线_【R语言】如何将照片快速转换为素描

【R语言】如何将照片快速转换为素描(三行代码给老婆(划掉)画一张素描)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com最近发现了一个比较好玩的包,叫做sketcher这个包的作用就是将图片转化成素描的样式以下是…

2021年程序员1月薪资统计,你在哪一档?

hi,大家好,我是开发者FTD。2021年1月份马上就要结束了,再过一周多春节也即将来临,春节后估计又是一波跳槽高峰,那我们一起来看一下当前程序员的薪资状况,让大家对于年后是否要换工作也有个心理预期吧。 注&…

海康sip服务器地址_完整SIP/SDP媒体协商概论SDP基础使用要求

接完整SIP/SDP媒体协商概论-SDP基础-核心定义全解。上一个章节笔者介绍了关于SDP的一些核心概念(第一章节和第二章节),今天,我们继续在此之间讨论SDP的其余基础内容(从第三章节开始)。在以下讨论中,笔者会介绍关于SDP的使用,SDP的…

一月:你今年还回家过年吗?

hi,大家好,我是开发者FTD。一月份对于我来说,是工作和生活渐渐明朗的一个月,之前迷茫的状态感觉在这一个月开始慢慢消失,并让整个人的精神状态开始转变。2021年才刚刚开始,大家也可以对自己新的一年进行一个…

6个座位办公室最佳位置_2021最佳动力艇大奖:6个类别29个入围名单揭晓

年度最佳动力艇大奖由英国杂志《Motor Boat & Yachting》(MBY)主办,经(MBY)深思熟虑,评委们缩小了2021年度最佳动力艇大奖的决赛入围名单。由于旅行限制,今年的形式会有所不同,不能像往年一样测试那么多的船。因此&#xff0c…

奇妙的安全旅行之ECC算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法的ECC算法。 ECC 算法简介 ECC 是 Elliptic Curves Cryptography 的缩写,意为椭圆曲线密码编码学。和RSA算法一样,ECC算法也属于公开密钥算法。最初由 Koblitz 和 Mi…

ant design 预览图片_AntD框架的upload组件上传图片时遇到的一些坑

前言本次做后台管理系统,采用的是 AntD 框架。涉及到图片的上传,用的是AntD的 upload 组件。前端做文件上传这个功能,是很有技术难度的。既然框架给我们提供好了,那就直接用呗。结果用的时候,发现 upload 组件的很多bu…

奇妙的安全旅行之国密算法

hi,大家好,我是开发者FTD。今天我们来介绍一下我们国家密码局制定的加密算法 — 国密算法。 为什么要制定国密算法? 密码算法是保障信息安全的核心技术,尤其是我国最关键的银行业核心领域长期以来都是沿用MD5、3DES、SHA-256、R…