Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的Spring安全项目中的BCrypt(Spring安全)_Java_Spring_Jakarta Ee_Spring Security - Fatal编程技术网

Java 我的Spring安全项目中的BCrypt(Spring安全)

Java 我的Spring安全项目中的BCrypt(Spring安全),java,spring,jakarta-ee,spring-security,Java,Spring,Jakarta Ee,Spring Security,我如何做加密。这样在数据库中就不会显示用户密码。我现在保存在数据库中-登录名和密码,用户角色。我需要密码必须加密(BCrypt) 在数据库中 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exceptio

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

}

非常简单-只需将
WedonotContentCryption()
函数替换为返回BCrypt实例的函数:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
BCryptPasswordEncoder
实现了
PasswordEncoder
(顾名思义),因此已经为
encode()
匹配()定义了好方法


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

当我们加密存储密码时,我们通常对它们进行散列,使其成为单向加密,即即使我们知道散列算法,也无法从加密密码中检索原始密码

我们遵循的主要步骤如下所示

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

  • 从登录表单获取密码,即“密码”
  • 读取存储在数据库中的哈希:“A3fcherf42d143d1w132dd23dsgrg5”
  • 从存储的散列密码“A3fcherf42”中提取盐
  • 将salt附加到用户输入的密码:“A3fcherf42password”
  • 散列密码,现在生成的散列应该与数据库中存储的散列匹配
使用Bcrypt实现这一点是一个简单的过程,因为大部分工作都由库处理。我解释了上述场景,以便您能够很好地理解幕后发生的事情。要生成并保存哈希密码,请执行以下操作

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
现在已经有了散列字符串,可以将其存储到数据库中

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

if (BCrypt.checkpw(entered_pw, stored_hash))
    return True;
请参阅有关BCrypt哈希的spring安全文档:


注意-如果使用BCrypt,则盐将作为哈希的一部分包含(如BCrypt规范所定义)。因此,不需要为salt创建额外的数据库列,因为它是密码的一部分。BCrypt在验证Bro时也会考虑到这一点,我会将您的代码添加到我的文件中。但是mySQL数据库中的密码仍然可见。这不会更改任何现有密码。尝试添加一个新密码,它应该以BCrypt格式显示。Spring中的密码编码器用于在将密码放入数据库时对其进行散列
BCryptPasswordEncoder.encode()
在数据库存储操作期间被调用,因此您不应该看到数据库中有任何差异。(仅供参考如果进行测试,您可以将ddl设置为
create
,以便在每次运行时设置新的db,这将避免这些错误。