Java中MessageDigest来实现数据加密的方法
作者:西北野狼 时间:2023-05-18 01:13:49
MessageDigest
MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。
MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。
对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。
举个简单的md5加密的例子:
package com.company;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MessageDigestTest {
public static void main(String[] args) throws NoSuchAlgorithmException {
String source = "123123";
String md5Str = getMd5(source);
System.out.println(md5Str);
}
/**
* 通过md5进行加密
* @param source 要加密的数据
* @return
* @throws NoSuchAlgorithmException
*/
private static String getMd5(String source) throws NoSuchAlgorithmException {
//1.获取MessageDigest对象
MessageDigest digest = MessageDigest.getInstance("md5");
//2.执行加密操作
byte[] bytes = source.getBytes();
//在MD5算法这,得到的目标字节数组的特点:长度固定为16
byte[] targetBytes = digest.digest(bytes);
//3.声明字符数组
char [] characters = new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//4.遍历targetBytes
StringBuilder builder = new StringBuilder();
for (byte b : targetBytes) {
//5.取出b的高四位的值
//先把高四位通过右移操作拽到低四位
int high = (b >> 4) & 15;
//6.取出b的低四位的值
int low = b & 15;
//7.以high为下标从characters中取出对应的十六进制字符
char highChar = characters[high];
//8.以low为下标从characters中取出对应的十六进制字符
char lowChar = characters[low];
builder.append(highChar).append(lowChar);
}
return builder.toString();
}
}
测试结果:
4297F44B13955235245B2497399D7A93
封装成工具类:
package com.company;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Tool {
private static ThreadLocal<MD5Tool> md5ToolThreadLocal = new ThreadLocal<>();
private MD5Tool() {
}
/**
* 获取一个MD5工具实例
*/
public static MD5Tool getInstance() {
if (md5ToolThreadLocal.get() == null) {
md5ToolThreadLocal.set(new MD5Tool());
}
return md5ToolThreadLocal.get();
}
/**
* 通过md5进行加密
*
* @param source 要加密的数据
* @return
* @throws NoSuchAlgorithmException
*/
public String getMd5(String source) throws NoSuchAlgorithmException {
//1.获取MessageDigest对象
MessageDigest digest = MessageDigest.getInstance("md5");
//2.执行加密操作
byte[] bytes = source.getBytes();
//在MD5算法这,得到的目标字节数组的特点:长度固定为16
byte[] targetBytes = digest.digest(bytes);
//3.声明字符数组
char[] characters = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
//4.遍历targetBytes
StringBuilder builder = new StringBuilder();
for (byte b : targetBytes) {
//5.取出b的高四位的值
//先把高四位通过右移操作拽到低四位
int high = (b >> 4) & 15;
//6.取出b的低四位的值
int low = b & 15;
//7.以high为下标从characters中取出对应的十六进制字符
char highChar = characters[high];
//8.以low为下标从characters中取出对应的十六进制字符
char lowChar = characters[low];
builder.append(highChar).append(lowChar);
}
return builder.toString();
}
}
来源:https://www.cnblogs.com/androidsuperman/p/10296668.html
标签:MessageDigest,加密
0
投稿
猜你喜欢
Mybatis结果生成键值对的实例代码
2023-11-28 15:50:58
Java main 方法面试题的详细整理
2023-11-24 23:53:30
SQLServer批量插入数据的三种方式及性能对比
2022-07-01 12:05:07
深入浅析hbase的优点
2021-08-06 19:27:58
Java面向接口编程之简单工厂模式示例
2021-07-14 21:40:27
带你重新认识MyBatis的foreach
2023-11-21 08:44:54
SpringMVC后端返回数据到前端代码示例
2023-06-20 13:12:47
Java线程的生命周期和状态控制_动力节点Java学院整理
2022-01-25 17:01:42
详解SpringBoot注入数据的方式
2022-05-09 06:34:24
IntellJ IDEA神器使用技巧(小结)
2023-08-08 22:01:44
C++ lambda函数详解
2023-06-20 07:49:43
基于SSM实现学生管理系统
2023-11-24 18:17:39
使用 BenchmarkDotNet 对 C# 代码进行基准测试
2023-06-25 00:38:49
Java多线程状态及方法实例解析
2021-09-10 22:49:53
C#实现QQ截图功能及相关问题
2022-10-30 08:47:01
Spring如何基于注解配置使用ehcache
2022-08-16 03:24:32
Java实现几种序列化方式总结
2023-02-13 06:18:27
解决javaWEB中前后台中文乱码问题的3种方法
2023-03-22 22:39:26
Android语音声波控件 Android条形波控件
2023-10-29 02:03:05
Java虚拟机执行引擎知识总结
2023-06-05 17:34:31