加密方案(待补充)
1、MD5加盐加密
MD5
Message Digest Algorithm MD5(消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
应用场景
密码加密: 在企业中,登录账户表,里面的密码是加密的,为了防止数据管理员或IT部内部人员数据泄密。注册用户的时候,添加用户,将用户数据新增到数据库里面的时候就将用户的密码加密存储。加密算法有很多种,有一种不可逆的加密算法MD5。
MD5的特点
1、压缩性:任意长度字符串根据散列哈希算法得到一个16进制32位字符长度的字符串
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5.、不可逆的算法:由A字符串加密成B字符串,B是永远无法反推出A的。
缺陷:
但是,有一个严重的缺陷:MD5加密时,相同的明文获得的密文的一致的。
市场上已经出现MD5的破解,主要使用的时彩虹表进行破解
解决方案
彩虹表 有两个数据,分别是明文和密文,主要是通过列举常用明文进行破解。所以当明文足够长的时候,被破解的概率就非常低,甚至不会被破解。
MD5加盐加密
加盐加密格式:用户名 + 密码 + UUID的随机字符串
UUID的随机字符串被称为盐,所以称为加盐加密。
MD5的工具类
import java.math.BigInteger;
import java.security.MessageDigest;
public class Md5Utils {
/**
* 对给定的字符使用md5进行加密,返回加密以后的字符串
* @param origin
* @return
*/
public static String getMd5(String origin) {
// 1) 使用静态方法,创建MessageDigest对象
try {
MessageDigest md = MessageDigest.getInstance("MD5");
// 2) 将字符串使用utf-8进行编码,得到字节数组
byte[] input = origin.getBytes("utf-8");
// 3) 使用digest(input)对字节数组进行md5的哈希计算,得到加密以后的字节数组,长度是16个字节。
byte[] num = md.digest(input);
// 4) 使用类BigInteger(1, 加密后的字节数组),将这个二进制数组转成无符号的大整数
// 1 正数, -1表示负数
String md5code = new BigInteger(1, num).toString(16);
// 5) 将这个大整数转成16进制字符串,参数为多少进制
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
System.out.println(getMd5("123"));
System.out.println(getMd5("abc"));
}
}
转化成MD5的几种方式
方式一:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.Test;
public class MD5Test {
@Test
public void test(){
String md5Hex = DigestUtils.md5Hex("123");
System.out.println(md5Hex);
}
}
方式二:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.3</version>
</dependency>
import cn.hutool.crypto.digest.DigestUtil;
import org.junit.Test;
public class MD5Test {
@Test
public void test(){
String md5Hex = DigestUtil.md5Hex("123");
System.out.println(md5Hex);
}
}