Algorithm:Java加密解密之MAC(消息认证码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Algorithm:Java加密解密之MAC(消息认证码)
MD5 消息摘要(数字摘要)
它是把⼀个⽂本/⽂件通过摘要函数(hash函数)计算出⼀个结果。

然后把⽂本/⽂件和摘要结果⼀同发给接受者
接受者接收到⽂件之后,也进⾏摘要,把两个摘要结果进⾏对⽐。

如果⼀致就说明⽂本/⽂件和摘要是⼀致的。

问题
假设A把⽂件和摘要发给B,中途被C截获了。

C把⽂件改了,同时把改后的⽂件进⾏摘要。

然后把改后的⽂件和重新⽣成的摘要发给B。

B收到结果之后,进⾏摘要,对⽐发现,是⼀致的。

但是此时⽂件是被篡改过的,B也不知道。

接收⽅并不能察觉到数据被篡改。

所以说,普通的消息摘要不能验证⾝份和防篡改!!
解决这个问题,我们可以使⽤MAC(消息认证码(带密钥的hash函数))去解决。

MAC (全称 Message Authentication Code),消息认证码(带密钥的Hash函数)
通信实体双⽅使⽤的⼀种验证机制,保证消息数据完整性的⼀种⼯具,在发送数据之前,发送⽅⾸先使⽤通信双⽅协商好的散列函数计算其摘要值。

在双⽅共享的会话密钥作⽤下,由摘要值获得消息验证码。

之后,它和数据⼀起被发送。

接收⽅收到报⽂后,⾸先利⽤会话密钥还原摘要值,同时利⽤散列函数在本地计算所收到数据的摘要值,并将这两个数据进⾏⽐对。

若两者相等,则报⽂通过认证。

计算摘要的时候,需要⼀个秘钥key,没有秘钥key就⽆法计算。

注意:相同的消息,不同的key,摘要结果不同。

java1.8代码演⽰
下⾯使⽤Java(1.8.0_144)演⽰计算apache-tomcat-8.5.23.zip⽂件的消息摘要
package com.security.dgst;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.Key;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import mons.codec.binary.Hex;
public class MacTest {
//秘钥(必须要是通信双⽅共享的)
static final String STR_KEY = "266f5fe18e714688a083df4ca9f78064";
/**
* 其中,Mac.getInstance⽀持的算法有:HmacMD5、HmacSHA1、HmacSHA256等等
* 全部⽀持的算法见官⽅⽂档:
* https:///javase/8/docs/technotes/guides/security/StandardNames.html#Mac
*/
public static byte[] mac(String algorithm, Key key, byte[] data) throws Exception {
Mac mac = Mac.getInstance(algorithm);
//这⾥是关键,需要⼀个key(这⾥就是和普通的消息摘要的区别点)
mac.init(key);
byte[] result = mac.doFinal(data);
return result;
}
public static void main(String[] args) throws Exception {
byte[] data = Files.readAllBytes(Paths.get("c:/tmp/apache-tomcat-8.5.23.zip"));
Key key = new SecretKeySpec(STR_KEY.getBytes(), "");
//使⽤MD5算法计算摘要
byte[] md5Digest = mac("HmacMD5", key, data);
//使⽤SHA256算法计算摘要
byte[] shaDigest = mac("HmacSHA256", key, data);
//把摘要后的结果转换成⼗六进制的字符串(也可以使⽤Base64进⾏编码)
System.out.println(Hex.encodeHexString(md5Digest));
System.out.println(Hex.encodeHexString(shaDigest));
}
}
Mac.getInstance(algorithm) 参数algorithm可以⽀持的值除了参考官⽅⽂档,还可以通过如下代码得出:
Security.getAlgorithms("Mac").forEach(System.out::println);
Java8中,输出结果如下:
PBEWITHHMACSHA512 PBEWITHHMACSHA224 PBEWITHHMACSHA256 HMACSHA384 PBEWITHHMACSHA384 HMACSHA256 HMACPBESHA1 HMACSHA224 HMACMD5 PBEWITHHMACSHA1 SSLMACSHA1 HMACSHA512 SSLMACMD5 HMACSHA1
输出结果为:
ce078fe3134fa8b50c595e4e984f88e0
d90eec24b04b81cd235ff8d4e5a9aeb00183e253e44b6ed763328ff97f856200
我们可以使⽤OpenSSL,加上上⾯使⽤的秘钥key,计算摘要。

对⽐结果,发现是⼀致的。

相关文档
最新文档