1、未加盐值
每次加密的结果一样
彩虹表可以暴力破解
/**
* 1、MD5抗修改性,彩虹表暴力破解md5,所以md5不能直接进行加密存储
* 2、盐值加密 MD5Crypt
*/
String s = DigestUtils.md5Hex("123456");
System.out.println(s);
2、人工加盐值
每次加密同样的盐值得到的结果一样
盐值:每个人吃肯德基的味道是一样的,但是如果随机加上点盐味道就会每个人都不一样了
将盐值作为一个字段存在数据库中,因为不可逆,用户可再次使用明文加盐值后和数据库的盐值做对比,来判断密码是否正确
String md5Crypt = Md5Crypt.md5Crypt("123456".getBytes(),"100");
System.out.println(md5Crypt);
3、自动加盐值
每次加密后的结果都不一样,自动给加上了盐值,无需人工再加盐值
这样如果100个用户的密码都是123456,但是存储到数据库加密后的密码也都不会一样,但是每一个数据库的密码都可以破解出同样的明文密码
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encode = passwordEncoder.encode("123456");
System.out.println(encode);
//登录时用match方法判断明文密码和之前生成的盐值密码是否相同
boolean matches = passwordEncoder.matches("123456", "$2a$10$mV2BU2ZVd1hkT/RKFadazeaEVrVnqGtjdOKnJUmqmZs2l22QGPQOK");
System.out.println(matches);