MD5 加密即 Message-Digest Algorithm 5,历经了 MD3,MD4 发展,在1991年提出。
- 中文名:消息摘要算法第五版
- 英文名:Message-Digest Algorithm5
- 提出时间:1991年
MD5 就是 byte 值和一个 int 的 255 进行 与
运算,得到一个 int 值,再将这个 int 值转化为十六进制的值,这样就完成了一个 MD5 摘要。
只能从明文加密为密文,不能把密文在转化为明文。加密后是不可逆性。确保明文的加密性。
通过MD5的明文进行摘要。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static void main(String[] args) {
String passWord = "123456";
StringBuilder sb = new StringBuilder();
//获取数据摘要器
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
//将一个byte数组进行加密操作,返回的是一个加密的byte数组,二进制的哈西计算,md5加密的第一步
byte[] digest = messageDigest.digest(passWord.getBytes());
for (int i = 0; i < digest.length; i++) {
int result = digest[i] & 0xff;
//将得到的int类型的值转化为16进制的值
String hexString = Integer.toHexString(result);
if (hexString.length()<2){//系统会自动把0省略,所以添加0
sb.append("0");
}
sb.append(hexString);
}
System.out.println(sb.toString());
} catch (NoSuchAlgorithmException e) {//找不到加密方式异常
e.printStackTrace();
}
}
}
|
输出结果为:
e10adc3949ba59abbe56e057f20f883e
上面的代码可以对123456
进行加密,但是目前网上有好多破解网站,他们的破解原理就是将一些常见的MD5
摘要密文保存到数据库中,通过比对来达到所谓的破解。所以通过下面的方法进行加密会完全是网上
通过对十六进制变量后进行不规则操作加密,在13行代码后边加数,进行不规则加密。这样会的话几乎已经无法完成破解了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static void main(String[] args) {
String passWord = "123456";
StringBuilder sb = new StringBuilder();
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] digest = messageDigest.digest(passWord.getBytes());
for (int i = 0; i < digest.length; i++) {
int result = digest[i] & 0xff;
String hexString = Integer.toHexString(result)+1;//不规则加密,俗称加盐
if (hexString.length()<2){
sb.append("0");
}
sb.append(hexString);
}
System.out.println("密码为 123456\n 加密后");
System.out.println(sb.toString());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
|
加密结果
e11a1dc1391491ba1591ab1be1561e01571f21f18813e1
这种是银行等系统要求安全性非常高的系统,一般会对加密后的密文再次进行一次MD5加密,这样进行10-30次,达到一个无法破解的密文。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
//银行 银行卡 6位数 将密码进行十到三十次MD5加密
public static void main(String[] args) {
String passWord = "123456";
StringBuilder sb = new StringBuilder();
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
for (int h = 0; h < 10; h++) { //进行多次循环加密
byte[] digest = messageDigest.digest(passWord.getBytes());
for (int i = 0; i < digest.length; i++) {
int result = digest[i] & 0xff;
String hexString = Integer.toHexString(result)+1;
if (hexString.length() < 2) {
sb.append("0");
}
sb.append(hexString);
}
passWord = sb.toString();
sb.delete(0, sb.length());
}
System.out.println(passWord);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
|
加密后结果:
6912c1901801301e61951b01281ca1f21ca1dd1dc17e12a1
补充 Kotlin
版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import java.security.MessageDigest
/**
* md5 加密工具类用于加密密码
* 默认没有加盐
*/
object Md5Utils {
private const val salt: Int = 0
fun md5(message: String): String {
val sb = StringBuilder()
val messageDigest = MessageDigest.getInstance("MD5")
val digest: ByteArray = messageDigest.digest(message.toByteArray())
for (i in 0 until digest.size) {
val result: Int = digest[i].toInt() and (0xff)
val hexString = Integer.toHexString(result) + salt
if (hexString.length < 2) {
sb.append("0")
}
sb.append(hexString)
}
return sb.toString()
}
}
|