一文搞懂Java MD5算法的原理及实现
作者:java奥斯卡 时间:2023-01-04 21:10:24
MD5加密简介
哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称。 从本质上讲,MD5也是一种哈希算法,其输出是生成128位的输出结果。 如果输入两个不同的明文,就会输出两个不同的输出值,并且根据输出值,不能得到原始的明文,这个过程是不可逆的。
MD5加密原理
MD5算法对512位报文的输入信息进行处理,每个报文被分成16个32位报文。 经过一系列处理后,算法的输出由4个32位的数据包组成,这些数据包级联生成一个128位的哈希值。
在MD5算法中,信息的填写方式是这样的:消息后面跟着一个1,然后是无数个0,直到512字节的剩余数等于448 (n*512) + 448。 为什么剩下的是448,因为剩下的512-448是64位,表示填充前的消息长度。 加上剩下的64位,(n+1)乘以512,也就是512的整数倍。
然后循环通过link变量获得结果。 MD5包含四个32位整数参数,称为链接变量:A=0x01234567, B= 0x89ABCdef, C= 0xFeDCba98, D=0x76543210。 一旦设置好四个链接变量,算法就开始了四轮循环。 具体的内部计算是关于数学的。如果你感兴趣,你可以自己理解。这里没有更多的解释。
MD5加密常用方法
/**
* 用MD5算法进行加密
* @param str 需要加密的字符串
* @return MD5加密后的结果
* @throws UnsupportedEncodingException
*/
public static String encodeMD5String(String str) {
return getMD5(str);
}
/**
* MD5编码方法, 该方法存在漏洞,特殊情况下编码后的字符串只有31位长度
* @param str
* @param method
* @return
* @throws UnsupportedEncodingException
*/
private static String encode(String str, String method) throws UnsupportedEncodingException {
MessageDigest md = null;
String dstr = null;
try {
md = MessageDigest.getInstance(method);
md.update(str.getBytes("UTF-8"));
dstr = new BigInteger(1, md.digest()).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return dstr;
}
/**
* MD5编码方法
* @param message
* @return
*/
public static String getMD5(String message) {
MessageDigest messageDigest = null;
StringBuffer md5StrBuff = new StringBuffer();
try {
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(message.getBytes("UTF-8"));
byte[] byteArray = messageDigest.digest();
for (int i = 0; i < byteArray.length; i++)
{
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
} catch (Exception e) {
throw new RuntimeException();
}
return md5StrBuff.toString().toUpperCase();//字母大写
}
/**
* 加密
* @param content
* @return
*/
public static String encrypt(String content) {
String password = "12345678dd";
byte[] encryptResult = encrypt(content, password);
String encryptResultStr = parseByte2HexStr(encryptResult);
return encryptResultStr;
}
/**
* 加密
* @param content
* @param password
* @return
*/
public static String encryptStr(String content, String password) {
byte[] encryptResult = encrypt(content, password);
return parseByte2HexStr(encryptResult);
}
/**
* 解密
* @param encryptResultStr
* @return
* @throws UnsupportedEncodingException
*/
public static String decrypt(String encryptResultStr) throws UnsupportedEncodingException {
String password = "12345678dd";
byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
byte[] decryptResult = decrypt(decryptFrom, password);
// 解密内容进行解码
String result = new String(decryptResult, UTF8);
return result;
}
/**
* 解密
* @param encryptStr
* @param password
* @return
* @throws UnsupportedEncodingException
*/
public static String decryptStr(String encryptStr, String password) throws UnsupportedEncodingException {
byte[] decryptFrom = parseHexStr2Byte(encryptStr);
byte[] decryptResult = decrypt(decryptFrom, password);
// 解密内容进行解码
return new String(decryptResult, UTF8);
}
来源:https://juejin.cn/post/7108546254543519781
标签:Java,MD5
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java中PriorityQueue实现最小堆和最大堆的用法
2022-03-25 14:32:18
![](https://img.aspxhome.com/file/2023/8/62758_0s.png)
分别在Groovy和Java中创建并初始化映射的不同分析
2023-11-26 08:15:42
Android Studio和Gradle使用不同位置JDK的问题解决
2023-06-27 17:35:04
![](https://img.aspxhome.com/file/2023/2/84222_0s.png)
Java这个名字的来历与优势
2023-03-27 18:28:40
微信小程序获取手机号,后端JAVA解密流程代码
2023-11-29 07:57:26
Idea里github的图形化操作配置方法
2021-12-29 15:03:17
![](https://img.aspxhome.com/file/2023/1/61511_0s.png)
Java实现简单猜数字小游戏
2023-11-28 08:10:07
![](https://img.aspxhome.com/file/2023/2/59052_0s.jpg)
android异步消息机制 源码层面彻底解析(1)
2023-10-02 07:08:52
![](https://img.aspxhome.com/file/2023/8/85958_0s.jpg)
Springboot与vue实现文件导入方法具体介绍
2023-10-31 12:31:37
![](https://img.aspxhome.com/file/2023/8/58738_0s.png)
java的泛型你真的了解吗
2022-07-25 09:40:06
![](https://img.aspxhome.com/file/2023/5/60355_0s.jpg)
Java Swing实现扫雷源码
2023-11-10 08:16:20
![](https://img.aspxhome.com/file/2023/9/59069_0s.jpg)
Java反射概念与使用实例代码
2022-02-24 23:55:40
java创建多级目录文件的实例讲解
2023-11-27 09:29:02
Java内存模型(JMM)及happens-before原理
2023-11-25 00:41:05
![](https://img.aspxhome.com/file/2023/2/59972_0s.png)
Java开发中可以防止界面假死的刷新代码
2023-11-23 22:23:41
新手小白学JAVA IDEA下载使用手册全集
2023-11-23 14:33:23
![](https://img.aspxhome.com/file/2023/3/59773_0s.jpg)
解决logback-classic 使用testCompile的打包问题
2021-07-01 08:16:50
Java流程控制语句最全汇总(中篇)
2023-11-10 23:52:50
![](https://img.aspxhome.com/file/2023/9/58849_0s.jpg)
java多线程Future和Callable类示例分享
2021-09-02 09:49:37
解决微服务feign调用添加token的问题
2023-09-11 09:38:05
![](https://img.aspxhome.com/file/2023/1/58331_0s.jpg)