为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白板的微信 2023-06-08 17:43:33
我该如何加密。这样在数据库中它就不会显示用户密码。我现在保存在数据库中 - 登录名和密码,用户角色。我需要密码必须在数据库中加密(BCrypt)@Configuration@EnableWebSecuritypublic 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);            }        };    }}
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

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

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

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

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


查看完整回答
反对 回复 2023-06-08
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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

我们遵循的主要程序如下。

  • 取字符串“密码”

  • 向密码添加盐(一个随机字符串,以确保具有相同密码的多个用户没有相同的散列密码):随机盐:“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;


查看完整回答
反对 回复 2023-06-08
  • 2 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信