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

问题描述 投票:0回答:2

如何进行加密。这样在数据库中就不会显示用户密码。我现在保存在数据库中 - 登录名和密码,用户角色。我需要密码必须加密(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);
            }
        };
    }

}
java spring jakarta-ee spring-security bcrypt
2个回答
7
投票

非常简单 - 只需将您的

weDoNotWantEncryption()
函数替换为返回 BCrypt 实例的函数即可:

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

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

请注意,这(当然)会使数据库中当前的任何密码变得不可用,尽管考虑到这些密码以明文形式存储,我假设(并希望/祈祷)这是在测试环境中,而不是生产环境中。


4
投票

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

我们执行此操作的主要程序如下。

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

现在验证用户登录:

  • 从登录表单中获取密码,即“密码”
  • 读取数据库中存储的哈希值:“A3fcherf42d143d1w132dd23dsgrg5”
  • 从存储的散列密码中提取盐:“A3fcherf42”
  • 将盐附加到用户输入的密码:“A3fcherf42password”
  • 对密码进行哈希处理,现在生成的哈希值应该与数据库中存储的哈希值相匹配。

使用 Bcrypt 执行此操作是一个简单的过程,因为大部分工作都是由库处理的。我解释了上述场景,以便您更好地了解幕后发生的事情。您执行以下操作来生成并保存散列密码。

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

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

当用户登录时,您会获取他输入的密码、数据库存储的哈希字符串,并对其进行验证。

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

请参阅此处有关 BCrypt 哈希的 Spring Security 文档:

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

© www.soinside.com 2019 - 2024. All rights reserved.