JDK自带的md5算法的使用
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class test_MD5 {
public static void main(String[] args) throws NoSuchAlgorithmException {
String s="nihao";
MessageDigest messageDigest=MessageDigest.getInstance("MD5");
byte[] digest = messageDigest.digest(s.getBytes());
for (byte b : digest) {
System.out.print(b+" ");
//25 76 -27 -48 -72 -100 71 -1 107 48 -65 -76 -111 -7 -36 38 -----nihao
//-20 22 -105 -79 -114 -5 5 -40 117 21 -82 102 111 -1 -3 74 -----ni hao
}
}
}
是的 你没看错 这就是自带的md5算法 ,可是 有人会说 不对呀 我看其他人都还有好多代码呀 你怎么能说这就结束了呢?
首先,我们看到,其实不论s是什么,最终都变成了一个byte数组 并且被分成了16个数字。
剩下的其实就是对这些数字进行改进一下,常见的就是
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class test_MD5 {
public static void main(String[] args) throws NoSuchAlgorithmException {
String s="nihao";
StringBuilder stringBuilder=new StringBuilder(32);
MessageDigest messageDigest=MessageDigest.getInstance("MD5");
byte[] digest = messageDigest.digest(s.getBytes());
for (byte b : digest) {
String s1 = Integer.toHexString(b & 0xff);//改变的地方在这里
stringBuilder.append(s1);
}
System.out.println(stringBuilder.toString());
}
}
其实就是将刚才的那些个数字变成了16进制。然后变成字符串拼接起来
这也是最常用的一种方式。
加盐
加盐就理解成一种把密码强度再度提升一下的方式。
例如 你传给我的是 nihao
那么我后台可以将nihao 和 一个固定好的字符串混合一下,例如和123qwe混合一下。
我可以这么混合:123qwenihao
我还可以这么混合:123nihaoqwe
我还可以:n123ihaqweo
我甚至还可以写一些逻辑,比如你传给我的字符串中的字符数是单数个,那么我用一种方式混合,当双数个的时候,我用另外一种方式混合,总之,就是按照一定的规律,把你传给我的东西变得复杂一点。
其实,这种方式可以发散的去想,不一定非要是和一个字符串拼接,倒置、重复等等都可以,总之,就是在原本的字符串的基础上变化一下。
举个例子:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class test_MD5 {
public static void main(String[] args) throws NoSuchAlgorithmException {
String s="nihao1";
if (s.length()%2==0){//偶数
s=s+s;
System.out.println(s);
}else {//奇数
s=s.charAt(0)+s;
System.out.println(s);
}
byte[] bytes = s.getBytes();
StringBuilder stringBuilder=new StringBuilder(32);
MessageDigest messageDigest=MessageDigest.getInstance("MD5");
byte[] digest = messageDigest.digest(bytes);
for (byte b : digest) {
String s1 = Integer.toHexString(b & 0xff);
stringBuilder.append(s1);
}
System.out.println(stringBuilder.toString());
}
}
那么 我这里的加盐方式 就是 用户给我的字符数是单数的时候,进行xxxx处理,双数的时候 经行xxxx处理,然后进行md5加密操作。
测试
如果不进行加盐操作 就是单纯的 md5一下 然后换成16进制输出
nihao 对应的32位字符串的是 194ce5d0b89c47ff6b30bfb491f9dc26
我们去 https://www.cmd5.com/ 网站看看能不能被破解
被破解了~~
那么我们加盐试一下,加盐之后,
nihao 对应的32位字符串是 5587eee648dde1d285b18cfe2f7d819
没能破解
总结
真正的md5加密其实使用起来简单,但是现在安全性已经不高了,我们需要加盐 来使它的安全性变高。