平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从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特靠谱,学习更多开发实战技巧!