技术标签: java hmac digest
消息摘要的概念
对消息通过一个单向Hash算法进行计算,得到一个唯一的结果。每个消息对应一个唯一结果,所有结果的长度固定。
消息摘要的分类
(1)MD5(Message Digest)消息摘要算法
(2)SHA(Secure Hash Algorithm)安全散列算法
(3)MAC(Message Authentication Code)消息认证码算法,结合了MD5和SHA的优势,同时用密钥对摘要进行加密,是一种更为安全的消息摘要算法。
日常应用
校验数据的完整性,防止在传输途中被篡改
编程使用
import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class MessageDigestUtil {
/**
* 计算MD5值
*/
public static String encryptMD5(byte[] data) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");//MD5,MD2
messageDigest.update(data);
return BytesToHex.fromBytesToHex(messageDigest.digest());
}
/**
* 计算文件的MD5值(指纹签名)
*/
public static String getFileMD5(String path) throws Exception {
FileInputStream fis = new FileInputStream(new File(path));
DigestInputStream dis = new DigestInputStream(fis, MessageDigest.getInstance("MD5"));
try {
byte[] buffer = new byte[1024];
int read = dis.read(buffer, 0, 1024);
while (read != -1) {
read = dis.read(buffer, 0, 1024);
}
MessageDigest md = dis.getMessageDigest();
return BytesToHex.fromBytesToHex(md.digest());
} finally {
dis.close();
fis.close();
}
}
/**
* 计算SHA值
*/
public static String encryptSHA(byte[] data) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("SHA");//SHA,SHA1,SHA-1,SHA-256,SHA-384,SHA-512
messageDigest.update(data);
return BytesToHex.fromBytesToHex(messageDigest.digest());
}
/**
* 初始化HMAC密钥
*/
public static byte[] initHmacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA512");//HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512
return keyGenerator.generateKey().getEncoded();
}
/**
* 使用Hmac生成的密钥对数据进行加密
*/
public static String encryptHmac(byte[] data, byte[] key) throws Exception {
SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");
Mac mac = Mac.getInstance("HmacSHA512");
mac.init(secretKey);
return BytesToHex.fromBytesToHex(mac.doFinal(data));
}
public static void main(String[] args) throws Exception {
String data = "123456";
String path = "/Users/admin/Downloads/httpd-2.4.20.tar.gz";
System.out.println(data + " 的MD5值: " + MessageDigestUtil.encryptMD5(data.getBytes()));
System.out.println(path + " 的文件MD5签名: " + MessageDigestUtil.getFileMD5(path));
System.out.println(data + " 的SHA值: " + MessageDigestUtil.encryptSHA(data.getBytes()));
byte[] hmacKey = initHmacKey();
System.out.println("初始化Hmac密钥:" + BytesToHex.fromBytesToHex(hmacKey));
System.out.println(data + " 是的Hmac加密值为: " + MessageDigestUtil.encryptHmac(data.getBytes(), hmacKey));
}
}
字节码数组转成16进制字符串工具类
public class BytesToHex {
public static String fromBytesToHex(byte[] resultBytes) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < resultBytes.length; i++) {
if (Integer.toHexString(0xFF & resultBytes[i]).length() == 1) {
builder.append("0").append(
Integer.toHexString(0xFF & resultBytes[i]));
} else {
builder.append(Integer.toHexString(0xFF & resultBytes[i]));
}
}
return builder.toString();
}
}
文章浏览阅读4.4k次。文章目录1. 准备工作2. 服务端配置(远程 server)2.1 下载与安装2.2 配置2.3 设置开机启动和后台运行2.4 测试3. 客户端配置(本地主机)3.1 下载与安装3.2 配置3.3 设置开机启动4. 连接测试1. 准备工作一台有公网 ip 的 server一台内网主机2. 服务端配置(远程 server)这里以阿里云 Centos 7 为例2.1 下载与安装进入 /tmp 目录cd /tmp在 Releases 页面下载与 server 系统、架构相符的 frp 版本_privilege_token
文章浏览阅读8k次,点赞14次,收藏58次。许多演示场景中使用的技术之一称为光线跟踪。该算法与一种称为“有符号距离函数”的特殊函数结合使用,可以实时创建一些非常酷的东西。这是系列教程,陆续推出,这篇涵盖以下黑体所示内容符号距离函数Ray-marching算法曲面法线和光照移动相机构造实体几何模型转换轮换和翻译统一缩放非均匀缩放和超越把它们放在一起参考1、符号距离函数符号距离函数,或简称为SDF,当给出空间中一个..._shadertoy
文章浏览阅读3.9k次。出现问题原因:commit相互依赖。具体讲就是:gerrit上已经存在commit A(commit A还未merge入库),然后你在commit A的代码基础上进行了修改(划重点,基于A修改!),并做了新的commit B,commit B已经包含了commit A的修改,于是在gerrit 上abondon commit A,只留下commit B在gerrit上,这样一来,commit B..._gerrit merge
文章浏览阅读2.9w次,点赞6次,收藏21次。来源:知乎普拉思驿站首先,还是要说一句,我当然不是猎头,但最近一段时间,我找到了业余生活的一大乐趣,就是在脉脉职言区看大家晒的 offer,然后觉得吧,光看不行,所以就顺手总结了一下,画..._快手职级多少对应p5
文章浏览阅读696次。直接body{ height: 100%; }不生效的话,那就在前面加个html吧,如下:html,body { height: 100% }如果想要知道原理的可以参阅下面这篇文章,写得很好转自:https://blog.csdn.net/javaloveiphone/article/details/51098972..._document.body.style.height 不生效
文章浏览阅读1.7k次,点赞3次,收藏12次。文章目录一、内容介绍1、内容2、效果二、具体实现1、组件传值2、点击事件3、图片展示4、加入购物车5、分隔条组件一、内容介绍1、内容本篇文章主要实现的是商品详情页的展示,主要包括商品图片展示、商品信息展示和商品评价展示2、效果二、具体实现1、组件传值goods.vue <Food :food="selectedFood" ref="food"></Food>food.vue通过props属性接收 props: { food: { type: _vue饿了么小程序商品页
文章浏览阅读283次。题意:在一棵只有点权的树上在线求据一个点x距离为k的点权和一言不合又是200+,而且还卡常~~~卡常~~~,幸好机智地加了读入输出优化险险地卡了过去 /笑每个节点建立两个线段树,以到点的距离为下标,记录权值和。第一棵记录其作为点分数父节点遍历其统治的子树的以距离为下标的点权和。由于点分树树高仅logn,暴力翻树高,在其经过的点分树祖先节点上查询距离为的k-now的点权和(now即为_点权修改,查询距离不超过k点权和
文章浏览阅读5.5k次,点赞19次,收藏73次。堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。在数据结构中,我们将堆的逻辑结构映射到数组中存储,如下图:于是在数组中,堆中节点的索..._c语言带结构体的小顶堆排序
文章浏览阅读5.5k次,点赞7次,收藏17次。新建文本文件这里我们新建一个记事本,注意里面的表格属性(列)之间要用英文的逗号隔开,现在我们把它保存,转换为一个csv文件转换为csv文件直接重命名文件扩展名即可,我们打开csv文件,发现是乱码修改编码方式我们继续将文件扩展名改为txt,打开后另存为,发现他的编码方式是UTF-8,我们将其修改为ANSI即可再次重命名为csv文件,打开就不会出现乱码..._txt转csv乱码
文章浏览阅读3.8k次。《石器时代M》是一款3D角色扮演手游,以“石器时代”为背景题材,我们将在开放式的大型地图上自由探索,超多的玩法内容,经典的策略回合制战斗,将给我们带来全新的游戏乐趣!接下来,和小编一起看下石器时代M电脑版教程哈!一、石器时代M电脑版教程1、首先呢,我们要做好玩前的准备工作,在电脑上下一个模拟器。因为要想在电脑上玩手游,就必须在电脑上装个模拟器,这个是电脑玩手游的前提条件,模拟器就相当于..._石器时代电脑
文章浏览阅读1.7w次,点赞5次,收藏11次。java在linux下新建目录需要先获取权限File f=new File("/home/hay");f.setWritable(true, false); //设置写权限,windows下不用此语句f.mkdirs();_setwritable
文章浏览阅读3.8w次,点赞48次,收藏175次。本文主要是整理了GPS轨迹数据集免费资源库,从这些库中能够免费下载到GPS数据,同时还整理出了这些数据的格式,数据集的简单描述等等。如果你发现更好的相关数据资源,欢迎共享 :)1. GeoLife GPS Trajectories该GPS轨迹数据集出自微软研究GeoLift项目。从2007年四月到2012年八月收集了182个用户的轨迹数据。这些数据包含了一系列以时间为序的点,每一个点包含经纬度、海拔_大西洋飓风数据下载