MessageDigest来实现数据加密
2023-09-14 08:59:00 时间
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();
}
}
相关文章
- [perl]数据相关
- EntityFrameworkCore-EF Core加密存储数据
- C#数据Encrypt加密Encrypt解密的算法使用
- 关于大数据你必须了解的几个关键词
- 把数据库中的数据制作成Excel数据
- 你必须知道的关于大数据的七个概念
- [破解] DRM-内容数据版权加密保护技术学习(中):License预发放实现
- 【转】网络游戏协议 -网络数据加密相关—摘自【游戏编程精粹】
- 对称加密算法-AES算法(高级数据加密标准)
- SQLServer · 最佳实践 · 透明数据加密在SQLServer的应用
- [破解] DRM-内容数据版权加密保护技术学习(中):License预发放实现
- 南大《探索数据的奥秘》课件示例代码笔记03
- 一位资深数据分析师的分享
- 数据公钥加密和认证中的私钥公钥
- 深入理解空间搜索算法 ——数百万数据中的瞬时搜索
- 使用SAP Analysis Path Framework (APF)展示CDS view数据
- Atitit 防伪防篡改方法总结关键数据的防篡改检验方法
- Atitit 常见触发器功能总结 目录 1.1. mysql触发器实例 插入数据前更改数据值.mhtml1 1.2. 数据修改后更改数据值1 1.3. 不能为空检测约束。。1 2. Ref2
- ML之FE:利用【数据分析+数据处理】算法对国内某平台上海2020年6月份房价数据集【12+1】进行特征工程处理(史上最完整,建议收藏)——附录
- 〖Python 数据库开发实战 - MySQL篇㊱〗- 综合案例 - 关于数据表 password 字段的数据加密
- 云小课|使用SQL加密函数实现数据列的加解密
- 云小课|云小课带你快速掌握云数据迁移CDM
- 同态加密实现数据隐私计算,能让你的小秘密更加秘密
- IPsec ESP与AH首部数据校验与加密范围
- python之修改某个单元格数据
- JS:crypto-js模块实现数据加密解密
- 如何用python,对接⼝中的数据进⾏md5加密?
- https 不会被中间人攻击——因为中间人即使拿到了数据,也是加密的