MD5加密、加盐和去盐

前言

在程序里有一些敏感信息需要加密。下面列一下常见的加密:

  • 散列加密 MD5是不可逆、不能解密、速度快等特点。
  • 对称加密法:根据相同的钥匙,进行加密和解密 大数据量的加密和解密。
  • 不对称加密法:两把钥匙,A钥匙加密的东西,B钥匙可以解开。B钥匙加密的东西,A钥匙可以解开,可以确认身份和加密,但是少量的数据。

示例

本次示例使用散列加密MD5,MD5现在已经被破解了,可以实现可逆。
下面把123加密出来,然后拿加密码到md5在线解密破解里面破解 。

在这里插入图片描述
我们看到已经解密出来了
在这里插入图片描述
所以现在的程序员都会削减脑袋想办法加密。然后有一种叫加盐的方法,这个方法很实用。它是在员在加密后在固定的某几个位置加入随机的字符。
在这里插入图片描述
现在我们拿加盐后加密码去解密。可以看到这个加盐后的码是解不开的,那么我们自己的程序怎么识别。来,那就是我们是不是知道在什么位置加了盐,是吧。然后我们就可以按我们之前记录的位置去盐。去盐的就不演示啦,下面已经把加密、加盐和去盐封装成一个方法。源码如下。
在这里插入图片描述
源码:

1package com.bdqn.it.util; 2 3import java.math.BigInteger; 4import java.security.MessageDigest; 5 6public class MD5Util { 7 8 // 加盐位置 9 public static int[] salts = { 3, 8, 16, 22, 25 }; 10 // 加密 11 public static String degst(String str){ 12 try { 13 MessageDigest md5 = MessageDigest.getInstance("md5"); 14 byte[] bb = md5.digest(str.getBytes("utf-8")); 15 16 // 1:不需要正负号,16:输出十六进制数据 17 String r = new BigInteger(1, bb).toString(16); 18 return r; 19 } catch (Exception e) { 20 throw new RuntimeException(e); 21 } 22 } 23 24 // 加盐方法 25 public static String addSalt(String md5Str) { 26 27 StringBuffer sb = new StringBuffer(md5Str); 28 29 for (int n = salts.length - 1; n >= 0; n--) { 30 int r = (int) (Math.random() * 10); 31 32 // 插入随机数 33 sb.insert(salts[n], r); 34 } 35 return sb.toString(); 36 } 37 38 // 去盐方法 39 public static String delSalt(String md5Str) { 40 StringBuffer sb = new StringBuffer(md5Str); 41 42 for (int n = 0; n < salts.length; n++) { 43 sb.deleteCharAt(salts[n]); 44 } 45 return sb.toString(); 46 } 47} 48 49 50

代码交流 2021