如何在spring security中对用户密码进行加密

最近在实践中接触了spring security密码加密的相关内容。

以前在数据库中存入用户密码的时侯,选择的都是明文密码,没有任何的安全性,这种方式其实非常的危险。所以我们需要在用户注册时就对用户键入的密码进行加密,然后存储到数据库中。之后在用户登录的时候再对数据中的加密密码和用户键入的密码进行一个对比的验证。

这里不推荐使用spring security自带的PasswordEncoder方法进行加密,因为这样很容易被破解掉。推荐编写自己的加密方法,可以选择SHA-1,SHA-256等算法,然后也可以在密码加密之前中加入盐值salt。然后写自己的MyPasswordEncoder方法然后重写PasswordEncoder,实现encode,matches方法。

spring security自带的PasswordEncoder方法如下所示:

public interface PasswordEncoder {

   String encode(CharSequence rawPassword);

   boolean matches(CharSequence rawPassword, String encodedPassword);

我们可以看到这个PasswordEncoder接口有两个方法,encode的方法是加密,matches方法是比较初始密码加密后是否等于加密后的密码。

下面展示一个小的例子:新建自己的MyPasswordEncoder方法实现PasswordEncoder接口中的两个方法,这里我就写了一个encode的方法。

public class MyPasswordEncoder implements PasswordEncoder {

    //加密算法
    private static MyDigestAlgorithm myDigestAlgorithm; 

    String encodedPassword = "";
    // add salt
    String saltedPassword = Common.SALT + rawPassword.toString();
    try {
        //encrypt the password
        encodedPassword = MyDigestAlgorithm.toHexString(MyAlgorithm.getSHA(saltedPassword));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

    return encodedPassword;
	}
  }
}

有了加密方法之后,就可以在service编写业务代码:简单来说就是,存入数据库之前把用户键入的密码加密,然后再存入数据库。例子如下所示:

public void addAccounts(Account account) {

        account.setPassword(myPasswordEncoder.encode(account.getPassword()));
        accountMapper.addAccounts(account);
        
}

因为我们是自己重写的PasswordEncoder方法,所以在spring security的config中,需要注入我们的加密类,否则登陆的时候就会认证失败。例子如下:

 @Bean
    public MyPasswordEncoder myPasswordEncoder(){

        return new MyPasswordEncoder();
    }

希望能对您有所帮助。

本文章首发于:

XuXing’s blog

欢迎大家访问。

你可能感兴趣的:(Java,java,数据库,spring,spring,security,spring,boot)