廖雪峰Java10加密与安全-3摘要算法-5Hmac
1 比较MD5和HamcMD5
HmacMD5可以看作带安全salt的MD5

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.Security;
public class SplitString {
public static void getMD5(String text,String salt) throws Exception{
//使用salt+MD5加密
byte[] data = text.getBytes("UTF-8");
byte[] bslat = salt.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(bslat);
md.update(data);
byte[] result = md.digest();
System.out.println(String.format("MD5加密:%0"+result.length+"x",new BigInteger(1,result)));
}
public static void getHmac(String text) throws Exception{
byte[] data = text.getBytes("UTF-8");
// 获取KeyGenerator实例
KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA1");
//获取一个随机的Key
SecretKey skey = keyGen.generateKey();
//获取一个Mac的实例
Mac mac = Mac.getInstance("HmacSHA1");
//先传入SecretKey,初始化
mac.init(skey);
//再计算输入数据的MD5
mac.update(data);
System.out.println(String.format("HmacSHA1加密:%0"+mac.doFinal().length*2+"x",new BigInteger(1,mac.doFinal())));
//打印SecretKey
byte[] key = skey.getEncoded();
System.out.println(String.format("Key:%0"+(key.length*2)+"x",new BigInteger(1,key)));
}
public static void main(String[] args) throws Exception{
String text = "hello 美女";
String salt = "stand up";
getMD5(text,salt);
getHmac(text);
}
}

## 2 代码示例
```#java
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import java.math.BigInteger;
public class SplitString {
public static byte[] hma(String hamcAlgorithm, SecretKey skey,byte[] data) throws Exception{
Mac mac = Mac.getInstance(hamcAlgorithm);
mac.init(skey);
mac.update(data);
return mac.doFinal();
}
public static void main(String[] args) throws Exception{
String[] algorithms = {"HmacMD5","HmacSHA1","HmacSHA256"};
String text = "hello world";
for(String s:algorithms){
KeyGenerator keyGen = KeyGenerator.getInstance(s);
SecretKey key = keyGen.generateKey();
byte[] data = text.getBytes("UTF-8");
byte[] reslut = hma(s,key,data);
System.out.println(String.format(s+":\t%0"+reslut.length*2+"x",new BigInteger(1,reslut))+"\t"+reslut.length);
}
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201905/1418970-20190510202600574-1584124211.png" width="500" />
## 3 总结:
* Hmac是把Key混入摘要的算法
* 可以配合MD5、SHA-1等摘要算法
* 摘要长度和原摘要算法长度相同
廖雪峰Java10加密与安全-3摘要算法-5Hmac的更多相关文章
- 廖雪峰Java10加密与安全-3摘要算法-4BouncyCastle
1.BouncyCastle: 第三方提供的一组加密/哈希算法 提供JDK没有提供的算法 RipeMD160哈希算法 官方网站 2.如何使用第三方提供的算法 2.1 添加第三方jar至classpat ...
- 廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法
1.SHA-1算法 SHA-1算法也是一种哈希算法. 输出160 bits/20bytes 由美国国家安全局开发 SHA-0/SHA-1/SHA-256/SHA-512 * SHA-0有问题,已经作废 ...
- 廖雪峰Java10加密与安全-3摘要算法-1MD5
1.摘要算法 1.1 摘要算法(哈希算法/Hash/数字指纹): 计算任意长度数据的摘要(固定长度) 相同的输入数据始终得到相同的输出 不同的输入尽量得到不同的输出 1.2 摘要算法目的: 验证数据和 ...
- 廖雪峰Java10加密与安全-6数字证书-1数字证书
数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改
- 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法
1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...
- 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...
- 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法
1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...
- 廖雪峰Java10加密与安全-4加密算法-2口令加密算法
对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...
- 廖雪峰Java10加密与安全-4加密算法-1对称加密算法
1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...
随机推荐
- VS 解决方案 Xamarin 配置
需要额外安装 Mono 程序 工具->Xamarin->Android -> SDK路径 要和 你配置的ANDROID_SDK_ROOT 的路径一至如果没有 ANDROID_SDK ...
- RocketMQ源码分析之RocketMQ事务消息实现原下篇(事务提交或回滚)
摘要: 事务消息提交或回滚的实现原理就是根据commitlogOffset找到消息,如果是提交动作,就恢复原消息的主题与队列,再次存入commitlog文件进而转到消息消费队列,供消费者消费,然后将原 ...
- ThinkPHP角色控制时的错误
1.Table 'think.think_user' doesn't exist 等的原因是因为'DB_PREFIX' => 'think_', // 数据库表前缀没有配置好,在使用角色控制时 ...
- vue框架介绍
vue框架介绍 一.vue 概念 vue 是一种开发用户界面的渐进式开发框架.渐进式指的是:你可以将vue作为一部分嵌入到web应用中,带来丰富的交互体验 二.vue特点及常见开发中的高级功能 1.解 ...
- hive 总结一
本文参考:黑泽君相关博客 本文是我总结日常工作中遇到的坑,结合黑泽君相关博客,选取.补充了部分内容. 上传数据 上传数据后执行修复 msck 命令 上传数据 hive> dfs -mkdir - ...
- PAT甲级——A1122 Hamiltonian Cycle【25】
The "Hamilton cycle problem" is to find a simple cycle that contains every vertex in a gra ...
- KVM热添加技术
1.KVM热添加的种类 硬盘.网卡.内存.cpu 2.KVM热添加硬盘 1.在宿主机上创建硬盘 qemu-img create -f qcow2 /opt/web02_add01.qcow2 10G ...
- python字符串的索引切片和常用操作方法,for循环
---恢复内容开始--- 一.字符串的索引与切片 1.索引 s = 'ASDFGHJKL' 有序序列,索引--index:从0开始 s1 = s[0],取出单个元素:A: s1是个全新的字符串和原字符 ...
- WPF drag过程中显示ToolTip.
原文:WPF drag过程中显示ToolTip. 在drag/drop过程中,我们在判断出over的元素上是否可以接受drag的东西之后,通常是通过鼠标的样式简单告诉用户这个元素不接受现在drag的内 ...
- Java开发系列-JSP
概述 JSP是java 服务器页面,它运行在服务器端,本质上就是一个serlvet,产生的java文件和class保留在tomcat的word目录下. JSP主要作用是将内容的生成与页面相分离. JS ...