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
  • asp之家 软件编程 m.aspxhome.com