为什么要进行密码加密?
在我们的日常生活中,许多人有着在不同网站上使用相同密码的坏习惯(包括我也是qaq),假如应用程序或服务器出现漏洞,数据被窃取,用户的明文密码直接被暴露给黑客。显然后果将不堪设想。使用密码加密可以有效地增加黑客破解密码的难度,提高安全性。
什么是md5加密和md5盐值加密?
- md5加密:
明文密码 + md5算法 = 密文密码 - md5盐值加密
盐值处理后的明文密码 + md5算法 = 密文密码
盐值可以由开发者进行自定义,这样密码被破解的可能性就有了显著的降低。
下面演示基于SpringBoot框架的shiro实现MD5盐值加密
SpringBoot整合shiro-实现MD5盐值加密
一、数据库中应有一个字段用于储存盐值
数据表.png二、数据表映射的实体类中应有盐值属性
package com.pedro.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private int id;
private String username;
private String password;
private String perms;
private String salt;
}
User.java
三、ShiroConfig中设置加密方式
1、设置加密算法并用@Bean标签注入Spring容器
//密码加密算法设置
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher(){
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
//设置加密方式
hashedCredentialsMatcher.setHashAlgorithmName("md5");
//设置散列的次数
hashedCredentialsMatcher.setHashIterations(2);
return hashedCredentialsMatcher;
}
2、realm中设置开启加密
@Bean
public UserRealm userRealm(){
//注入realm
UserRealm userRealm = new UserRealm();
//注入密码加密
userRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return userRealm;
}
四、修改realm类中的认证方法
UserRealm.java那么注册用户时如何对用户设置的密码进行加密呢?
一、可以准备一个用于加密的工具方法
public class PasswordGenerateUtil {
public static String getPassword(String username, String password, String salt, int hashTimes) {
//利用传入的信息进行加密,得到密文
Md5Hash md5Hash = new Md5Hash(password, username + salt, hashTimes);
//返回密文
return md5Hash.toString();
}
}
二、注册用户时注意
- 向数据库中存入用户信息时调用工具方法,加密密码再存入
- 存入用户信息时候记得把盐值也存进去
String salt1 = Long.toString(System.currentTimeMillis());
注意事项:
- 加密密码时设置的盐值处理方式必须和realm中存入info时的盐值处理方式设置得一样
- 加密时的散列次数必须和ShiroConfig中加密算法的bean中设置的一样
2020-5-24
网友评论