package com.ard.work.sdk.zlxd.utils; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5加密工具类 * 支持普通MD5、带盐值MD5、16位/32位加密结果 */ public class MD5Utils { /** * 私有构造器,禁止实例化 */ private MD5Utils() { } /** * 基础MD5加密(32位小写) * @param content 要加密的内容 * @return 32位小写MD5加密结果 */ public static String md5(String content) { return md5(content, null, StandardCharsets.UTF_8, false); } /** * 带盐值的MD5加密(32位小写) * @param content 要加密的内容 * @param salt 盐值(推荐使用随机字符串,避免彩虹表破解) * @return 带盐值的32位小写MD5加密结果 */ public static String md5WithSalt(String content, String salt) { if (salt == null || salt.isEmpty()) { return md5(content); } // 盐值拼接规则:内容 + 盐值(也可根据需求调整为 盐值 + 内容 + 盐值) return md5(content + salt, null, StandardCharsets.UTF_8, false); } /** * 通用MD5加密方法(支持自定义编码、是否16位结果) * @param content 加密内容 * @param salt 盐值(可为null) * @param charset 字符编码 * @param is16Bit 是否返回16位结果(默认32位) * @return MD5加密结果 */ public static String md5(String content, String salt, java.nio.charset.Charset charset, boolean is16Bit) { if (content == null) { throw new IllegalArgumentException("加密内容不能为空"); } try { // 初始化MD5摘要算法 MessageDigest md = MessageDigest.getInstance("MD5"); // 拼接盐值(如果有) String encryptContent = content; if (salt != null && !salt.isEmpty()) { encryptContent += salt; } // 计算MD5摘要 byte[] digest = md.digest(encryptContent.getBytes(charset)); // 将字节数组转换为16进制字符串 StringBuilder sb = new StringBuilder(); for (byte b : digest) { // 转换为两位16进制数,不足补0 String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } // 16位结果:截取32位结果的第8到24位 if (is16Bit) { return sb.substring(8, 24); } return sb.toString(); } catch (NoSuchAlgorithmException e) { // MD5是JDK内置算法,理论上不会抛出该异常 throw new RuntimeException("MD5加密算法不存在", e); } } // 测试示例 public static void main(String[] args) { // 测试普通MD5加密 String plainText = "SDtt@0531"; String md5Result = MD5Utils.md5(plainText); System.out.println("普通MD5加密(32位):" + md5Result); // 输出:e10adc3949ba59abbe56e057f20f883e // 测试带盐值MD5加密 String salt = "8738783d7abd9960ec26b26d0dc1ebc5"; // 自定义盐值 String md5WithSaltResult = MD5Utils.md5WithSalt(plainText, salt); System.out.println("带盐值MD5加密:" + md5WithSaltResult); // 输出:3f79bb7b435b05321651daefd374cdc6 // 测试16位MD5加密 String md516BitResult = MD5Utils.md5(plainText, null, StandardCharsets.UTF_8, true); System.out.println("16位MD5加密:" + md516BitResult); // 输出:49ba59abbe56e057 } }