繁体   English   中英

BCrypt在我的Spring Security项目中(Spring security)

[英]BCrypt in my Spring Security project (Spring security)

我该怎么做加密。 因此,在数据库中它不会显示用户密码。 我现在保存在数据库中 - 登录名和密码,用户角色。 我需要密码必须在数据库中加密(BCrypt)

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .antMatchers("/**").permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/allStudents")
                .and()
                .logout()
                .and()
                .csrf().disable();
    }

    @Bean
    public PasswordEncoder weDoNotWantEncryption() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence rawPassword) {
                return rawPassword.toString();
            }

            @Override
            public boolean matches(CharSequence rawPassword, String encodedPassword) {
                return rawPassword.toString().equals(encodedPassword);
            }
        };
    }

}

非常简单-只需将您的weDoNotWantEncryption()函数替换为一个返回BCrypt实例的函数即可:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

BCryptPasswordEncoder实现了PasswordEncoder (顾名思义),因此已经具有为encode()matches()定义的良好方法。

请注意,这将(当然)使数据库中当前的所有密码都不可用,尽管鉴于这些密码是以明文形式存储的,但我假设(并希望/祈祷)这是在测试环境中而不是在生产环境中。

当我们加密用于存储的密码时,通常会对其进行哈希处理,因此这是一种单向加密,即,即使我们知道哈希算法,也无法从加密的密码中检索原始密码。

为此,我们遵循的主要过程如下。

  • 取字符串“ password”
  • 在密码中添加一个盐(一个随机字符串,以确保多个具有相同密码的用户没有相同的哈希密码):随机盐:“ A3fcherf42”,生成的字符串:“ A3fcherf42password”
  • 使用加密算法将该字符串散列,您可能会得到:“ d143d1w132dd23dsgrg5”
  • 在验证用户登录名时,将盐附加到加密的密码中,以供将来使用:“ A3fcherf42d143d1w132dd23dsgrg5”
  • 使用用户标识将其保存在数据库中

现在验证用户登录:

  • 从登录表单中获取密码,即“密码”
  • 读取存储在数据库中的哈希:“ A3fcherf42d143d1w132dd23dsgrg5”
  • 从存储的哈希密码“ A3fcherf42”中提取盐
  • 将盐添加到用户输入的密码:“ A3fcherf42password”
  • 哈希密码,现在生成的哈希应与数据库中存储的哈希匹配。

使用Bcrypt做到这一点很简单,因为大多数工作都是由库处理的。 我解释了上述情况,因此您对幕后发生的事情有很好的了解。 您执行以下操作来生成并保存哈希密码。

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());

现在您有了哈希字符串,可以将其存储到数据库中。

用户登录时,您将使用其输入的密码,数据库存储的哈希字符串并进行验证。

if (BCrypt.checkpw(entered_pw, stored_hash))
    return True;

请参阅有关BCrypt哈希的Spring安全文档:

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/crypto/bcrypt/BCrypt.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM