如何解决无状态基本身份验证API如何使用密码哈希算法?
我有一个spring
Web服务api,用于从属性文件中验证用户身份。到目前为止,密码已以bcrypt
算法存储。
问题:我的api是无状态的,因此任何basic auth
请求都将强制重新计算bcrypt身份验证,从而导致每个请求的延迟大约 100ms 。
问题:建议在无状态api的每个请求上使用哪种算法来加密用户密码(无论是在属性文件还是db中)?
关注身份验证性能,但不能忽略安全性。
解决方法
我将跳过加密密码,而是使用令牌。这样的解决方案之一就是JWT(Json Web令牌),Spring提供了对它们的开箱即用的支持。
您可以看一个示例here。
您可以走得更远(这是我的职责),并将所有这些委托给OAuth提供程序。我通常为此使用Keycloak。
,最后,我决定创建一个缓存身份验证处理程序。它从基本身份验证以及所属的哈希bcrypt字符串中兑现密码。但前提是验证成功。
通过这种方式,我可以通过有效的身份验证来加快已知客户端的速度(因为我不必为它们重新计算bcrypt哈希匹配),但是仍然保留bcrypt
算法带来的蛮力优势。
以下是特定于弹簧的实现:
static class CachingDelegatingPasswordEncoder implements PasswordEncoder {
private final PasswordEncoder delegate = PasswordEncoderFactories.createDelegatingPasswordEncoder();
private final Map<String,String> cache = new HashMap<>();
@Override
public String encode(CharSequence rawPassword) {
return delegate.encode(rawPassword);
}
@Override
public boolean matches(CharSequence rawPassword,String encodedPassword) {
String cachedPassword = cache.get(rawPassword);
if (cachedPassword != null && StringUtils.equals(cachedPassword,encodedPassword))
return true;
boolean match = delegate.matches(rawPassword,encodedPassword);
if (match) cache.put(rawPassword.toString(),encodedPassword);
return match;
}
}
@Configuration
static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
public void configure(AuthenticationManagerBuilder builder) throws Exception {
DaoAuthenticationProvider p = new DaoAuthenticationProvider();
p.setPasswordEncoder(new CachingDelegatingPasswordEncoder());
p.setUserDetailsService(userDetailsService);
p.afterPropertiesSet();
builder.authenticationProvider(p);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。