Java中MessageDigest来实现数据加密的方法
作者:西北野狼 发布时间:2023-05-18 01:13:49
标签:MessageDigest,加密
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


猜你喜欢
- 这篇文章主要介绍了Java实现inputstream流的复制代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 本文将通过AOP的方式实现一个相对更加简易灵活的API安全认证服务。我们先看实现,然后介绍和分析AOP基本原理和常用术语。一、Authori
- 时间戳在游戏开发中虽然是一个比较小的功能?但是如果缺少这个功能就会导致开发遇到困难,为了帮助大家开发,下面就给大家介绍下将时间戳的使用方法,
- 在实际的项目开发中会有很多的对象,如何高效、方便地管理对象,成为影响程序性能与可维护性的重要环节。Java 提供了集合框架来解决此类问题,线
- 本文实例为大家分享了java实现超市管理系统的具体代码,供大家参考,具体内容如下实现功能使用选择结构,循环结构,数组的知识实现一个超市管理系
- 我就废话不多说了,大家还是直接看代码吧~package com.zejian.annotationdemo; import java.lan
- 由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载。项目使用的Spring+Mybatis+SpringMVC框架,利用
- 这篇文章主要介绍了java 读取系统Properties代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件、下载文件,本文给大家介绍如何利用jakarta commo
- 在前面几篇文章中,我们详细介绍了Androi
- Java的位操作符用来操作整数基本数据类型中的单个“比特”(bit),即代进制位。而我们知道比特就是0和1,那么,位操作就是对这些数据进行基
- 由于项目这种类型的图片按钮比较多,所以重写了ImageButton类。package me.henji.widget;import andr
- 1、抓取一般内容需要三个类:WebRequest、WebResponse、StreamReader所需命名空间:System.Net、Sys
- java异常分为两大类,Checked异常和Runtime异常,Checked异常都是在编译阶段可以被处理的异常。Checked异常和Run
- 1.这是一个通过Java反射机制解析的工具类2.使用时只需创建对应的对象,并在Excel的第一行填上对应的属性名3.首先要添加相关的jar包
- 现在的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦、光学变焦这些只有单反才有的功能,甚至有些手机
- SpringBoot @ComponentScan的使用SpringBoot的启动类中有一个@ComponentScan,之前项目由于这个注
- 目录1.摘要2.C#中定时任务的最简方法3.定时任务阻塞现象4.阻塞现象原因分析5.问题解决总结1.摘要本文会介绍一个C#中最简单定时任务的
- 本文实例讲述了Android实现捕获TextView超链接的方法。分享给大家供大家参考,具体如下:这里分享一篇捕获TextView超链接的文
- 效果图一、绘制圆环圆环故名思意,第一个首先绘制是圆环1:圆环绘制函数圆环APIpublic void drawArc (RectF oval