Java中MessageDigest来实现数据加密的方法

 更新时间:2020年05月22日 09:56:54   作者:西北野狼  
这篇文章主要介绍了Java中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();
  }

}

到此这篇关于Java中MessageDigest来实现数据加密的方法的文章就介绍到这了,更多相关MessageDigest 数据加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java将文件转成流文件返回给前端详细代码实例

    java将文件转成流文件返回给前端详细代码实例

    Java编程语言提供了强大的文件处理和压缩能力,下面这篇文章主要给大家介绍了关于java将文件转成流文件返回给前端的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • java实现计算周期性提醒的示例

    java实现计算周期性提醒的示例

    本文分享一个java实现计算周期性提醒的示例,可以计算父亲节、母亲节这样的节日,也可以定义如每月最好一个周五,以方便安排会议
    2014-04-04
  • SpringBoot整合Logback日志框架及高并发下的性能优化

    SpringBoot整合Logback日志框架及高并发下的性能优化

    在现代的Java应用开发中,日志记录是不可或缺的一部分,Spring Boot作为目前最流行的Java开发框架之一,默认集成了Logback作为日志框架,Logback是Log4j的继任者,具有更高的性能和更丰富的功能,本文将详细介绍如何在Spring Boot中整合Logback日志框架
    2025-03-03
  • 使用Prometheus+Grafana的方法监控Springboot应用教程详解

    使用Prometheus+Grafana的方法监控Springboot应用教程详解

    这篇文章主要介绍了用Prometheus+Grafana的方法监控Springboot应用,本文通过实例代码详解给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Spring MVC整合 freemarker及使用方法

    Spring MVC整合 freemarker及使用方法

    Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,这篇文章主要介绍了Spring MVC整合 freemarker及使用方法,需要的朋友可以参考下
    2019-07-07
  • 浅谈一下Java多线程断点复制

    浅谈一下Java多线程断点复制

    这篇文章主要介绍了浅谈一下Java多线程断点复制,当程序执行中断时(出现错误、断电关机),仍可以从上次复制过程中重新开始(不必从头开始复制),需要的朋友可以参考下
    2023-04-04
  • idea导入springboot项目没有maven的解决

    idea导入springboot项目没有maven的解决

    这篇文章主要介绍了idea导入springboot项目没有maven的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot项目War包部署无法注册到Nacos中的解决

    SpringBoot项目War包部署无法注册到Nacos中的解决

    这篇文章主要介绍了SpringBoot项目War包部署无法注册到Nacos中的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • springboot与vue详解实现短信发送流程

    springboot与vue详解实现短信发送流程

    随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容
    2022-06-06
  • java简易文本分割器实现代码

    java简易文本分割器实现代码

    这篇文章主要为大家详细介绍了java简易文本分割器的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07

最新评论