jdk中自带MD5的使用以及加盐
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加密其实使用起来简单,但是现在安全性已经不高了,我们需要加盐 来使它的安全性变高。