【问题标题】:Upgrading Spring Security PasswordEncoder升级 Spring Security PasswordEncoder
【发布时间】:2021-08-30 04:46:25
【问题描述】:

升级自:

import org.springframework.security.authentication.encoding.PasswordEncoder;

    @Override
    public String encodePassword(String plainPassword, Object salt) {
        final String finalSalt = salt != null ? salt.toString() : "";
        return DigestUtils.md5Hex(finalSalt + plainPassword);
    }

    @Override
    public boolean isPasswordValid(String encodedPassword, String plainPassword, Object salt) {
        final String enteredPassword = encodePassword(plainPassword, salt);
        return encodedPassword.equals(enteredPassword);
    }

收件人:

import org.springframework.security.crypto.password.PasswordEncoder;

    @Override
    public String encode(CharSequence rawPassword) {
      final String finalSalt = salt != null ? salt.toString() : "";
      return DigestUtils.md5Hex(finalSalt + plainPassword);
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
       final String enteredPassword = encodePassword(plainPassword, salt);
       return encodedPassword.equals(enteredPassword);
    }
  1. 不确定如何处理salt
  2. 不确定是否可以将rawPassword 转换为String 以替换plainPassword

【问题讨论】:

  • 请不要使用MD5做密码散列,长期不安全。

标签: java spring spring-security


【解决方案1】:

新方法期望盐是编码密码的一部分。根据PasswordEncoder.encoder() javadoc

对原始密码进行编码。通常,一个好的编码算法会应用 SHA-1 或更大的哈希值以及 8 字节或更大的随机生成的 salt。

如果您查看this answer,它会显示BCryptPasswordEncoder 如何在编码密码中编码盐。实际的 BCrypt 编码密码格式说明here

【讨论】:

  • 那么新的encode 方法基本上应该就是这样做的吧? return new org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder().encode(rawPassword); 和新的 matches 方法呢? return encodedPassword.equals(enteredPassword);?
  • 另外,你知道现在是否应该删除SystemWideSaltSource 吗?我的设置为super.setSystemWideSalt("pc567");,我怀疑更改它可能会导致一些问题
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 2014-11-09
  • 2016-11-28
  • 1970-01-01
  • 2013-06-30
  • 2014-05-26
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多