最近写一些实际小项目,我以为没什么问题,结果被骂了。主要原因还是我用写练习demo的思路来写的,在用户登录这一块,不仅密码明文储存还把明文密码给暴露了出来。自己学习了一下常见的加密算法,记录一下。
常见的加密算法有很多种,比如SHA-1,Md5,Md5Hash加密算法等。我使用的是Md5Hash的加密算法对密码进行加密,这里也主要介绍Md5Hash的加密算法。其实思路很简单,我们首先产生一个salt值,然后再让这个salt值和用户注册账号时输入的明文密码进行md5hash运算,这里我们不必自己写算法,我们可以引入org.apache.shiro.crypto.hash.Md5Hash这个包,用它提供的方法。
public static String getMd5HashSalt(int length){
String str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuffer sb=new StringBuffer();
try{
//2. 由Random生成随机数
Random random = SecureRandom.getInstanceStrong();
//3. 长度为几就循环几次
for(int i=0; i<length; ++i){
//从62个的数字或字母中选择
int number=random.nextInt(62);
//将产生的数字通过length次承载到sb中
sb.append(str.charAt(number));
}
} catch (NoSuchAlgorithmException e){
log.error("EncryptionUtil#getMd5HashSalt: message={}",e.getMessage());
throw new BusinessException(ErrorCodeEnum.DATA_MD5_ERROR);
}
//将承载的字符转换成字符串
return sb.toString();
}
public static String md5Hash(String password,String salt){
String md5Password = new Md5Hash(password, salt,2).toString();
return md5Password;
}
通过反编译我们看到Md5Hash类这个方法有许多的构造方法
为了安全我们选择了需要散列值的方法。除此之外,在实际开发中我们返回给前端的数据为了安全是不会返回密码和我们的salt值的,我们可以使用@JsonIgnore这个注解。此注解用于属性或者方法上(最好是属性上),在生成json时不成添加了该注解的属性。
我们在postman上可以看到返回的数据就不显示password和salt值了。