【发布时间】:2019-01-17 12:51:14
【问题描述】:
我有一个 Spring boot 2.0.1 服务,我添加了使用 BCrypt 进行散列的基本身份验证。但是这项服务在添加基本身份验证之前平均需要 400 毫秒,现在需要超过 1 秒。我正在使用用户详细信息服务,它在哈希映射中查找发送的用户名并返回用户详细信息。我尝试将 BCrypt 轮数减少到 4,但这并没有太大的区别。
之前我启用了无状态身份验证,后来我将其禁用,但性能仍然很差。此服务托管在 Docker 容器中。
以下是我的安全配置。
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private UserDetailsService userDetailsService;
@Autowired
public SecurityConfig(UserDetailsServiceImpl service) {
this.userDetailsService = service;
}
@Bean
public PasswordEncoder passwordEncoder() {
Map encoders = new HashMap<>();
encoders.put(BCRYPT_ID, new BCryptPasswordEncoder(BCRYPT_ROUNDS));
return new DelegatingPasswordEncoder(BCRYPT_ID,encoders);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors()
.and()
.csrf().disable()
.httpBasic();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
}
如果我遗漏了什么,请告诉我。
更新:我运行了基准测试,看起来 BCrypt 编码器使应用程序变慢。我发现一些 Stack Overflow 的答案讨论 BCrypt 哈希计算是一个阻塞调用。
关于硬件:服务主机有Intel Xeon E5,16GB内存。它托管 4 个 Spring boot 服务,每个服务分配 2 GB 运行在 Docker 容器内。
【问题讨论】:
-
您是否对您的应用程序进行了基准测试?你知道哪里它很慢吗?说“我有一个非常复杂的黑匣子。我在另一个非常复杂的黑匣子中运行它。我正在另一个非常复杂的黑匣子中运行它。”对人们提供体面的答案没有帮助。看看one provided - 这基本上是一个没有根据的猜测。
-
同意。我运行了基准测试并更新了问题。
-
BCrypt 应该很慢。因此,如果是 BCrypt 让事情变慢,那么这就是预期的行为。
-
我遇到了这个 SO 问题:stackoverflow.com/questions/36471723/…您认为这是预期行为还是 Spring 安全 BCrypt 实现问题?
-
@BoristheSpider 另外,我尝试使用 SCrypt 编码器代替 BCrypt,它的平均性能为 300 毫秒,而 BCrypt 为 1000 毫秒。从我读到现在的内容来看,SCrypt 虽然是最近才出现的,但它是一个很好的散列算法。所以只是想知道 SCrypt 是否旨在提供良好的性能和安全性?
标签: java spring-boot spring-security basic-authentication bcrypt