前言
在程序里有一些敏感信息需要加密。下面列一下常见的加密:
- 散列加密 MD5是不可逆、不能解密、速度快等特点。
- 对称加密法:根据相同的钥匙,进行加密和解密 大数据量的加密和解密。
- 不对称加密法:两把钥匙,A钥匙加密的东西,B钥匙可以解开。B钥匙加密的东西,A钥匙可以解开,可以确认身份和加密,但是少量的数据。
示例
本次示例使用散列加密MD5,MD5现在已经被破解了,可以实现可逆。
下面把123加密出来,然后拿加密码到md5在线解密破解里面破解 。
我们看到已经解密出来了
所以现在的程序员都会削减脑袋想办法加密。然后有一种叫加盐的方法,这个方法很实用。它是在员在加密后在固定的某几个位置加入随机的字符。
现在我们拿加盐后加密码去解密。可以看到这个加盐后的码是解不开的,那么我们自己的程序怎么识别。来,那就是我们是不是知道在什么位置加了盐,是吧。然后我们就可以按我们之前记录的位置去盐。去盐的就不演示啦,下面已经把加密、加盐和去盐封装成一个方法。源码如下。
源码:
package com.bdqn.it.util;
import java.math.BigInteger;
import java.security.MessageDigest;
public class MD5Util {
// 加盐位置
public static int[] salts = { 3, 8, 16, 22, 25 };
// 加密
public static String degst(String str){
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
byte[] bb = md5.digest(str.getBytes("utf-8"));
// 1:不需要正负号,16:输出十六进制数据
String r = new BigInteger(1, bb).toString(16);
return r;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 加盐方法
public static String addSalt(String md5Str) {
StringBuffer sb = new StringBuffer(md5Str);
for (int n = salts.length - 1; n >= 0; n--) {
int r = (int) (Math.random() * 10);
// 插入随机数
sb.insert(salts[n], r);
}
return sb.toString();
}
// 去盐方法
public static String delSalt(String md5Str) {
StringBuffer sb = new StringBuffer(md5Str);
for (int n = 0; n < salts.length; n++) {
sb.deleteCharAt(salts[n]);
}
return sb.toString();
}
}