MD5散列值加密

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~

MD5散列值加密

1 md5加密简介

      MD5(Message-Digest Algorithm 5),即消息摘要算法第五版,是一种被广泛使用的密码散列函数。可用于数字签名、密码加密存储等场景。

      散列算法的基础原理是:将数据(如一段文字)运算,变为一个固定长度(16字节)的字节数组。MD5 可以产生出一个128位(16字节)的散列值(hash value),用于确保传输的信息完整一致。

      通过封装,可以将16字节的散列值的每个字节分别转换成16进制数(每个字节对应2位16进制数),因此最终得到的16进制数字符串长度为32位!

2 md5加密特点

      MD5 算法具有以下特点:

      (1)压缩性:任意长度的数据,运算得出的 MD5 值长度都是固定的(128二进制位,16字节);

      (2)易计算:原数据很容易计算出 对应MD5值;

      (3)抗修改性:对原数据的任何改动(哪怕只修改1个字符),计算得到的 MD5 值都不同(极端情况下也会存在相同值);

      (4)不可逆:知道MD5值无法反推得到原数据。MD5消息摘要是不可逆的,其主要作用是对信息一致性和完整性的校验。

3 MD5加密工具类

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import lombok.extern.slf4j.Slf4j;

/**
 * MD5散列值计算工具类
 */
@Slf4j
public class Md5Util {

  /**
   * 16进制字符
   */
  private static final char[] HEX_DIGIT = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

  /**
   * 线程共享变量
   */
  private static ThreadLocal<MessageDigest> digesterContext = new ThreadLocal<>();

  /**
   * 初始化
   */
  private static MessageDigest init() {
    MessageDigest digester = null;
    try {
      digester = digesterContext.get();
      if (digester == null) {
        digester = MessageDigest.getInstance("MD5");
        digesterContext.set(digester);
      }
      digester.reset();
      return digester;
    } catch (NoSuchAlgorithmException e) {
      log.error(e.getMessage(), e);
      throw new IllegalStateException("doesn't support MD5 algorithm");
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new IllegalStateException("init exception");
    }
  }

  /**
   * md5加密,默认UTF-8编码
   */
  public static String md5(String str) {
    if (str == null) {
      return null;
    }
    MessageDigest digester = init();
    return bytes2String(digester.digest(str.getBytes(StandardCharsets.UTF_8)));
  }

  /**
   * md5加密,指定编码类型
   */
  public static String md5(String text, String encoding) {
    if (text == null) {
      return null;
    }
    MessageDigest digester = init();
    try {
      return bytes2String(digester.digest(text.getBytes(encoding)));
    } catch (UnsupportedEncodingException e) {
      log.error(e.getMessage(), e);
      throw new IllegalStateException("doesn't support encoding");
    }
  }

  /**
   * byte数组转换为十六进制字符串
   */
  private static String bytes2String(byte[] bytes) {
    if (bytes == null || bytes.length == 0) {
      return "";
    }
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
      sb.append(byte2Hex(b));
    }
    return sb.toString();
  }

  /**
   * 单个byte转换为十六进制字符串
   */
  private static String byte2Hex(byte ib) {
    char[] ob = new char[2];
    ob[0] = HEX_DIGIT[(ib >>> 4) & 0X0F];
    ob[1] = HEX_DIGIT[ib & 0X0F];
    return new String(ob);
  }

  public static void main(String[] args) {
    String content = "关注微信公众号:IT特靠谱";
    String md5Str = Md5Util.md5(content, "UTF-8");
    log.info("md5加密前:{}", content);
    log.info("md5加密后:{}", md5Str);
  }
}

4 MD5加密测试结果

     

    (1) 商务合作微信号:M9392W

    (2) 购物商城: 扫码即可进入博主开发的小程序购物商城,享超大优惠购物,支持一下博主吧~

    (3) 博主微信公众号IT特靠谱,学习更多开发实战技巧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Most

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值