一、什么是HMAC

HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思。

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

使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512。

二、HMAC的计算步骤

 1、密钥填充

如果密钥比单向散列函数分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。

如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。

2、填充后的密钥与ipad的XOR

将填充后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。

XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

3、与消息组合

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

4、计算散列值

将3的结果输入单向散列函数,并计算出散列值。

5、填充后的密钥与opad的XOR

将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。

XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

6、与散列值组合

将4的散列值拼在opadkey后面。

7、计算散列值

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

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

 三、HMAC应用

HAMC主要应用在身份验证,服务器对访问者进行鉴权,流程如下图所示:

 四、HMAC-SHA256实现Demo

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; public class Sha256_mac {
public static String sha256_mac(String message,String key){
String outPut= null;
try{
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
outPut = byteArrayToHexString(bytes);
}catch (Exception e){
System.out.println("Error HmacSHA256========"+e.getMessage());
}
return outPut;
}
public static String byteArrayToHexString(byte[] b) {
StringBuilder sb = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
sb.append('0');
sb.append(stmp);
}
return sb.toString().toLowerCase();
} }

最新文章

  1. HTML5复习整理
  2. 【Alpha版本】十天冲刺集结令
  3. javaweb项目打包成war包
  4. Android中layout_gravity和gravity的区别
  5. hmailserver
  6. 警惕SQL语句陷井
  7. 研究jdk关于TreeMap 红黑树算法实现
  8. sql in查询排序
  9. Html5元素及基本语法
  10. Wildfly 中支持jersey,并websocket的默认配置修改。
  11. python中的字符串和数字连接
  12. 分散式-ubuntu12.04安装spark-1.0.0
  13. 大数据系列修炼-Scala课程03
  14. jvm系列 (五) ---类加载机制
  15. 钉钉开发入门,微应用识别用户身份,获取用户免登授权码code,获取用户userid,获取用户详细信息
  16. centos7+cobbler+kickstart
  17. 关于vagrant一个虚拟机搭建多个项目配置(总结)
  18. python问题:TypeError: a bytes-like object is required, not &#39;str&#39;
  19. sourcetree file status checkbox gone (文件状态下的勾选文件 list 消失)
  20. 如果django里的视图是类(CBV),应该如何写Url的测试用例?

热门文章

  1. libevent中最小堆实现算法解析
  2. python批量向kafka塞数据
  3. GeforceRTX系列参数对比
  4. 如何写新的Python OP
  5. GPU端到端目标检测YOLOV3全过程(上)
  6. 利用MONAI加速医学影像学的深度学习研究
  7. 基于C语言文件操作的学生成绩管理系统
  8. 这 7 个 Linux 命令,你是怎么来使用的?
  9. IntelliJ IDEA不好用?那是因为没掌握这些技巧
  10. 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作