• java使用MD5加密


    一、主要使用MessageDigest类(java.security包下

    1、首先,先看下官方文档

    • 此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
    • MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。
    • 对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态

    2、接下来看几个MessageDigest的方法(按照使用顺序介绍)

    1. public static MessageDigestgetInstance(String algorithm)
                                       throws NoSuchAlgorithmException
      返回实现指定摘要算法的 MessageDigest 对象。参数algorithm为加密方式,可选MD5、sha...
    2. void
      update(byte[] input)
                使用指定的 byte 数组更新摘要。
    3. 获取摘要字节数组
      public byte[] digest()

    通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置

    返回:

    存放哈希值结果的 byte 数组。

    3、将字节数组转换成16进制字符串

      为什么要将字节数组转换成16进制字符串?

    我们使用digest()方法获得MessageDigest生成的摘要后需要将其转换成String字符串

    Java中无论是汉字还是英文字母都是用Unicode编码来表示的,一个Unicode码是16位,每字节是8位,所以一个Unicode码占两字节。

    但是英文字母比较特殊,源自于8位(1字节)的ASCII码,于是在Unicode码仅使用了低8位(1字节)就可以表示,高8位的话不使用也无所谓。

    代码如下:

    String str = "lalalla";
     byte[] resultByteArray;
     try {
     //获取MessageDigest对象
                MessageDigest messageDigest = MessageDigest.getInstance("MD5");
     messageDigest.update(str.getBytes());
     resultByteArray = messageDigest.digest();
     for(Byte content:resultByteArray){
     System.out.println(content);
     }
     System.out.println(bytesToHexFun2(resultByteArray));
     } catch (NoSuchAlgorithmException e) {
     e.printStackTrace();
     } 

     二、byte[]转十六进制String(转载自:http://blog.csdn.net/worm0527/article/details/69939307)

    所谓十六进制String,就是字符串里面的字符都是十六进制形式,因为一个byte是八位,可以用两个十六进制位来表示,因此,byte数组中的每个元素可以转换为两个十六进制形式的char,所以最终的HexString的长度是byte数组长度的两倍

    1. private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5',
    2. '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
     
    
    1. /**
    2. * 方法二:
    3. * byte[] to hex string
    4. *
    5. * @param bytes
    6. * @return
    7. */
    8. public static String bytesToHexFun2(byte[] bytes) {
    9. char[] buf = new char[bytes.length * 2];
    10. int index = 0;
    11. for(byte b : bytes) { // 利用位运算进行转换
    12. buf[index++] = HEX_CHAR[b >>> 4 & 0xf];//高四位
    13. buf[index++] = HEX_CHAR[b & 0xf];//低四位
    14. }
    15. return new String(buf);
    16. }

    如果是使用MD5得到的摘要进行转换,那么得到的字符串为32位(因为MD5得到的摘要的字节数组的长度为16),这样我们利用二中byte[]转十六进制String的方法将一中生成的字节数组进行转换,即得到我们需要的String类型的MD5加密字符串。

    注意:如果使用new String(byteArray)将获得的字节数组直接转换成String,则会出现乱码

  • 相关阅读:
    【halcon】halcon轮廓总结之select_contours_xld
    大文件RandomAccessFile类来分片传输
    Spring Boot关掉APR
    MobileNetV2架构解析
    基于Element-Plus动态配置Menu 菜单栏
    计算机毕业设计(附源码)python智能旅游电子票务系统
    window小技巧---------电脑自动开关机/电脑自动开机后打开应用/打开浏览器后自动响应某个页面并且f12
    学习Hutool工具类库
    C++ 非泛型,自定义类str_的迭代。
    nginx.3——local的优先级和匹配方式
  • 原文地址:https://blog.csdn.net/m0_62089210/article/details/126477902