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的更多相关文章

  1. 廖雪峰Java10加密与安全-3摘要算法-4BouncyCastle

    1.BouncyCastle: 第三方提供的一组加密/哈希算法 提供JDK没有提供的算法 RipeMD160哈希算法 官方网站 2.如何使用第三方提供的算法 2.1 添加第三方jar至classpat ...

  2. 廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法

    1.SHA-1算法 SHA-1算法也是一种哈希算法. 输出160 bits/20bytes 由美国国家安全局开发 SHA-0/SHA-1/SHA-256/SHA-512 * SHA-0有问题,已经作废 ...

  3. 廖雪峰Java10加密与安全-3摘要算法-1MD5

    1.摘要算法 1.1 摘要算法(哈希算法/Hash/数字指纹): 计算任意长度数据的摘要(固定长度) 相同的输入数据始终得到相同的输出 不同的输入尽量得到不同的输出 1.2 摘要算法目的: 验证数据和 ...

  4. 廖雪峰Java10加密与安全-6数字证书-1数字证书

    数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改

  5. 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法

    1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...

  6. 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法

    1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...

  7. 廖雪峰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 ...

  8. 廖雪峰Java10加密与安全-4加密算法-2口令加密算法

    对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...

  9. 廖雪峰Java10加密与安全-4加密算法-1对称加密算法

    1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...

随机推荐

  1. bzoj1433: [ZJOI2009]假期的宿舍 [二分图][二分图最大匹配]

    Description Input Output Sample Input 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 Sample Output ˆ ˆ HINT 对于30% ...

  2. 0927CSP-S模拟测试赛后总结

    84pts rank28 经历了一个阶段的持续低迷,终于回到自己之前的位置了啊. 尽管依旧不是太靠上,但是还是证明了我的努力. 宿舍三人的风水轮流转之谈终究只是戏言和巧合.嘟嘟和Lockey都进第一机 ...

  3. 大数据之hadoop小文件存档

    hadoop小文件存档1.HDFS存档小文件弊端 每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效.因为大量的小文件会耗尽NameNode中的大部分内 ...

  4. python相关软件安装流程图解——MySQL 8.0.13安装教程(windows 64位)——MYSQL依赖的软件——MYSQL必须的系统DLL插件——MYSQL真正的安装

    https://www.mysql.com/https://www.mysql.com/downloads/https://dev.mysql.com/downloads/windows/https: ...

  5. python相关软件安装流程图解——虚拟机安装——CentOS-7-x86_64-DVD-1810——CentOS-01下载——CentOS-02安装——CentOS-03配置操作

    http://www.xitongzhijia.net/soft/24315.html http://www.downxia.com/downinfo/4574.html     .

  6. HDU-1492-The number of divisors(约数) about Humble Numbers -求因子总数+唯一分解定理的变形

    A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, ...

  7. Python学习之文件操作(二)

    CSV文件处理 在Python中处理CSV文件可以使用模块csv.有关csv模块的官方资料看这里. 1 读取csv文件 csv.reader(csvfile, dialect='excel', **f ...

  8. C++返回引用的需求

    1.重载+=操作符返回*this或者某个参数的引用可以方便链式调用,比如C++流操作就是cout<< a << b << c这样的,就是靠不停返回stream的引用 ...

  9. [转]Entity Framework教程(第二版)

    源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...

  10. 1.前端数据可视化插件:Highcharts、Echarts和D3(区别)

    前端数据可视化插件有很多,但我用过的只有Highcharts(https://www.hcharts.cn/).Echarts(http://echarts.baidu.com/)和D3(https: ...