欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

三种Java实现MD5加密和解密的方法

最编程 2024-02-03 09:17:12
...
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
* MD5加密工具类
* @description
* 不可逆算法(非对称算法)
* md5加密会将数据加密成16进制字符串,其加密结果有且只有两种情况:
* 1.默认情况
* HexString.Length=32,当md5进行加密时,其加密后的长度不够32位时,会在前面自动补0;
* 2.自定义
* HexString.Length<32,我们可以手动来控制不让其在前面自动补0。
* 3.虽然md5默认加密结果是16进制,但是,我们可以自定义加密结果的形式;
* 但是,约定俗成的MD5加密结果是16进制。
* @author: Marydon
* @date: 2020年07月13日 0013 15:01
*/
@Slf4j
public final class Md5Utils extends EncodeDecodeTemplate{

private Md5Utils() {
}

private static final String ALGORITHM_NAME = "MD5";

/*
* md5加密(32位)
* @description:
* @date: 2022/3/3 9:51
* @param: plainText 明文
* @return: java.lang.String 密文
* 16进制加密字符串(大写)
* 固定长度:32位
*/
@NotNull
public static String encrypt32ToHexString(@NotNull String plainText) {
log.info("MD5待加密字符串:" + plainText);
String hexString = encodeToHexString(core32(plainText.getBytes(StandardCharsets.UTF_8)));
log.info("MD5加密结果(Length=32):" + hexString);
return hexString;
}

/*
* md5加密核心实现(自动补零,32位)
* @description: 当加密解过不够32位时,自动在最前面补0,直到补够32位
* @date: 2022/3/2 17:58
* @param: plainBytes 待加密二进制数据
* @return: byte[] 加密结果
*/
@Nullable
private static byte[] core32(byte[] plainBytes) {
try {
return MessageDigest.getInstance(ALGORITHM_NAME).digest(plainBytes);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
log.error("MD5加密失败:{}", e.getMessage());
return null;
}
}

/*
* md5加密(<=32位)
* @description: 当长度不够32位时,不用补0
* @date: 2022/3/3 10:12
* @param: plainText 明文
* @return: java.lang.String 密文
*/
@NotNull
public static String encryptToHexString(@NotNull String plainText) {
log.info("MD5待加密字符串:" + plainText);
try {
MessageDigest md5 = MessageDigest.getInstance(ALGORITHM_NAME);
// 计算md5函数
md5.update(plainText.getBytes(StandardCharsets.UTF_8));
//digest()最后确定返回md5 hash值,返回值为8位字符串。
//因为md5hash值是16位的hex值,实际上就是8位的字符
//BigInteger函数则将8位的字符串转换成16位hex值,
//用字符串来表示;得到字符串形式的hash值
String hexString = new BigInteger(1, md5.digest()).toString(16).toUpperCase();
log.info("MD5加密结果(Length<=32):" + hexString);
return hexString;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
log.error("MD5加密失败:{}", e.getMessage());
return "";
}
}

public static void main(String[] args) {
String str = "++iNr+/=.0.瞾肇";
encryptToHexString(str);
str = "zhang三11111111";
encrypt32ToHexString(str);

}
}

推荐阅读