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 org.apache.commons.codec.binary.Hex; public class MacTest { //秘钥(必须要是通信双方共享的)
static final String STR_KEY = "266f5fe18e714688a083df4ca9f78064"; /**
* 其中,Mac.getInstance支持的算法有:HmacMD5、HmacSHA1、HmacSHA256等等
* 全部支持的算法见官方文档:
* https://docs.oracle.com/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,计算摘要。
对比结果,发现是一致的。
文章转载至:https://blog.csdn.net/mn960mn/article/details/78174234
Algorithm:Java加密解密之MAC(消息认证码)的更多相关文章
- password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...
- cooking java ——加密解密
java安全与密码概述 主要分为三部分: 密码学基础,包括:相关术语:分类:常用安全体系. java的安全组成:jdk以及第三方扩展. 相关实现代码,包括:base64.MD5········ 密码学 ...
- Java加密解密大全
ChinaSEI系列讲义(By 郭克华) Java加密解密方法大全 如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...
- PBOC圈存时用到3DES加密解密以及MAC计算方法
最近在做PBOC圈存时用到了3DES的加密解密以及MAC计算问题,在网上了解一些知识,复制了一些demo学习,我这里没有深入研究,只是把我用到的和了解的做个总结,便于以后使用和学习. 3DES分双倍长 ...
- 为什么要使用消息认证码(MAC)而非对称密钥?
问题: 看了消息认证码的介绍后,小丽心想"如果用对称密码将消息加密后再发送的话,是不是就不需要消息认证码了呢?"原因有下: 1.对称密码的密文只有使用和加密时相同的密钥才能正确解密 ...
- ◆JAVA加密解密-3DES
从数据安全谈起 当你使用网银时,是否担心你的银行卡会被盗用? 当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露? 作为开发者,编写安全的代码比编写优雅的代码更重要,因为 ...
- java加密解密的学习
注:此文章只是对如何学习java加密解密技术做一个讲解.并不涉及具体的知识介绍,如果有需要请留言,有时间我补冲长.个人觉着学习一个学习方法比学习一个知识点更有价值的多. 首先,对于加密解密知识体系没有 ...
- Java加密解密字符串
http://www.cnblogs.com/vwpolo/archive/2012/07/18/2597232.html Java加密解密字符串 旧文重发:http://www.blogjava ...
- java加密解密
java加密解密 public class MD5Util { /** * @param args */ public static void main(String[] args) { System ...
随机推荐
- 060.Python组件-中间件
一 中间件基本介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会 ...
- MyBatis 高级查询之一对多查询(十)
高级查询之一对多查询 查询条件:根据游戏名称,查询游戏账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据游戏名查询游戏账号 * @param ...
- MyBatis 数据源的原理和机制
回顾JDBC JDBC访问数据库流程 加载驱动 获取Connection连接对象(消耗性能) 获取PrepareStatement对象 执行SQL语句 获取结果集 关闭Connection连接对象 存 ...
- linux命令--使用fsck修复文件系统
使用fsck修复文件系统错误 1.问题描述 服务器maint_samba 由于服务器maint_samba (debian操作系统)没有正常关机,在重新启动过程中/dev/sdb1出现文件系统错误,需 ...
- 10.16-17 mailq&mail:显示邮件传输队列&发送邮件
mailq命令 是mail queue(邮件队列)的缩写,它会显示待发送的邮件队列,显示的条目包括邮件队列ID.邮件大小.加入队列时间.邮件发送者和接受者.如果邮件进行最后一次尝试后还没有将邮件投递出 ...
- RabbitMQ 集群原理
RabbitMQ默认集群原理 rabbitmq 本身是基于erlang编写,erlang语言天生具备分布式的特性(通过同步Erlang集群各节点的erlang cookie实现),RabbiteMQ天 ...
- 【三】Kubernetes学习笔记-Pod 生命周期与 Init C 介绍
一.容器生命周期 Init C(初始化容器)只是用于 Pod 初始化的,不会一直随着 Pod 生命周期存在,Init C 在初始化完成之后就会死亡. 一个 Pod 可以有多个 Init C,也可以不需 ...
- Jmeter(四十七) - 从入门到精通高级篇 - 分布式压测部署之负载机的设置(详解教程)
1.简介 千呼万唤始出来,这一篇感觉写了好久,总想写的清楚明白简洁,但是还是洋洋洒洒写了好多,希望大家喜欢吧!本来打算将这一篇文章是放在性能测试中讲解和分享的,但是有的童鞋或者小伙伴们私下问的太多了, ...
- Spring Cloud Alibaba系列之分布式服务组件Dubbo
本博客的例子代码可以在github找到下载链接:代码下载 SpringBoot.SpringCloud Alibaba系列博客专栏:链接 1.分布式理论 1.1.分布式基本定义 <分布式系统原理 ...
- Wrong——Python
1.向MySQL中插入时间(年月日时分秒),在时分秒处报错.在年月日与时分秒中间有个空格.解决办法:在sql语句中时间用一个" "包起来就可以了.. 2.在Ubuntu的cront ...