BCrypt是一个被认为适合密码存储的安全的密码哈希方法。它是一个使用Blowfish加密算法的变体的密码学算法。BCryptPasswordEncoder
是Spring Security提供的一个类,Spring Security是一个强大且高度可定制的Java应用程序的认证和访问控制框架。这个类使用BCrypt算法实现密码编码。但是有些业务需求不适合该加密方式,要改成MD5方式。
需要修改项目中以下几个地方:
1.增加一个Md5PasswordEncoder 来继承PasswordEncoder,实现encode和matches两个方法,实现自定义加密逻辑
项目中增加一个Md5PasswordEncoder类(加哪里都可以)
里面的getMd5是自定义的加密逻辑,这里我是在网上找的,如果要用其他的加密算法,比如md5加盐也可以去网上找找。
import org.springframework.security.crypto.password.PasswordEncoder;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5PasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence rawPassword) {
return getMd5(rawPassword.toString());
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
// Compare the raw password (provided by the user) with the encoded password (from the database)
return getMd5(rawPassword.toString()).equals(encodedPassword);
}
public static String getMd5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
BigInteger no = new BigInteger(1, messageDigest);
String hashtext = no.toString(16);
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
return hashtext;
} catch (NoSuchAlgorithmException e) {
System.out.println("Exception thrown"
+ " for incorrect algorithm: " + e);
return null;
}
}
}
2.第二步找到securityConfig的配置文件,在项目中的framework 中的config,可以找到两个方法,
在配置文件中新增一个Md5PasswordEncoder方法,注入bean,
把configure方法中的bCryptPasswordEncoder()修改为新增的passwordEncoder().
如下:
configure是注入security加密算法,所以注入上一步咱们构建的Md5PasswordEncoder
/**
* 强散列哈希加密实现
*/
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder()
{
return new BCryptPasswordEncoder();
}
/**
* 身份认证接口
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
{
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public Md5PasswordEncoder passwordEncoder(){
return new Md5PasswordEncoder();
}
3.修改common中的utils的securityUtils,其中要修改两个方法encryptPassword和matchesPassword(登录的流程会调用这两个方法)
把原先的代码注释掉:
/**
* 生成BCryptPasswordEncoder密码
*
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password)
{
// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// return passwordEncoder.encode(password);
Md5PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder();
return md5PasswordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword)
{
// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// return passwordEncoder.matches(rawPassword, encodedPassword);
Md5PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder();
return md5PasswordEncoder.matches(rawPassword,encodedPassword);
}
大功告成!由此登录的加密方式就变成了自定义的加密逻辑(MD5)。