qq_26875793 2020-03-30 17:52 采纳率: 0%
浏览 268

服务端用spring security BCryptPasswordEncoder 进行加密,那么客户端怎么加密,如何怎么传值。那么要明文吗?

服务端用spring security BCryptPasswordEncoder 进行加密,那么客户端怎么加密,如何怎么传值。那么要明文传吗?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-21 01:53
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/761478
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:记录Spring Security使用BCryptPasswordEncoder出现的情况
    • 除此之外, 这篇博客: Spring Security-(BCryptPasswordEncoder)加密及判断密码是否相同/编写自己的密码编码器PasswordEncoder中的 三、BCryptPasswordEncoder源码分析 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      Spring Security PasswordEncoder 密码校验和密码加密流程
      参考URL: https://www.jianshu.com/p/922963106729

      public class BCryptPasswordEncoder implements PasswordEncoder
      
      public interface PasswordEncoder {
          String encode(CharSequence var1);
          boolean matches(CharSequence var1, String var2);
      }
      

      BCryptPasswordEncoder实现了PasswordEncoder接口,需要实现其加密密码匹配的方法。

        public BCryptPasswordEncoder() {
              this(-1);
        }
      
        public BCryptPasswordEncoder(int strength) {
              this(strength, (SecureRandom)null);
        }
        public BCryptPasswordEncoder(int strength, SecureRandom random) {
              this.BCRYPT_PATTERN = Pattern.compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");
              this.logger = LogFactory.getLog(this.getClass());
              this.strength = strength;
              this.random = random;
          }
      
          public String encode(CharSequence rawPassword) {
              String salt;
              if (this.strength > 0) {
                  if (this.random != null) {
                      salt = BCrypt.gensalt(this.strength, this.random);
                  } else {
                      salt = BCrypt.gensalt(this.strength);
                  }
              } else {
                  salt = BCrypt.gensalt();
              }
              return BCrypt.hashpw(rawPassword.toString(), salt);
          }
      
          public boolean matches(CharSequence rawPassword, String encodedPassword) {
              if (encodedPassword != null && encodedPassword.length() != 0) {
                  if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
                      this.logger.warn("Encoded password does not look like BCrypt");
                      return false;
                  } else {
                      return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
                  }
              } else {
                  this.logger.warn("Empty encoded password");
                  return false;
              }
          }
      
      

      使用SecureRandom生成的强(安全)随机数作为盐进行加密,不需要我们去记录这个盐,因为它会直接混在加密后的密码串中。
      加密与匹配都是调用了BCrypt类中的方法。

      我们再来看看一个创建密码编码器工厂方法
      org/springframework/security/crypto/factory/PasswordEncoderFactories.java

      public static PasswordEncoder createDelegatingPasswordEncoder() {
          String encodingId = "bcrypt";
          Map<String, PasswordEncoder> encoders = new HashMap<>();
          encoders.put(encodingId, new BCryptPasswordEncoder());
          encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());
          encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());
          encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));
          encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());
          encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
          encoders.put("scrypt", new SCryptPasswordEncoder());
          encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));
          encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));
          encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());
      
          return new DelegatingPasswordEncoder(encodingId, encoders);
      }
      

      上述代码 encoders 的 Map 包含了很多种密码编码器,有 ldap 、MD4 、 MD5 、noop 、pbkdf2 、scrypt 、SHA-1 、SHA-256

      上面静态工厂方法可以看出,默认是创建并返回一个 BCryptPasswordEncoder,同时该 BCryptPasswordEncoder( PasswordEncoder 子类)也是 Spring Security 推荐的默认密码编码器,其中 noop 就是不做处理默认保存原密码。

      总结:spring secrity默认使用 bcrypt算法,注意看这个构造函数就没有提供选择的余地,直接返回写死的 encodingId 为bcrypt 算法。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器