微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无状态基本身份验证API如何使用密码哈希算法?

如何解决无状态基本身份验证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 举报,一经查实,本站将立刻删除。