【发布时间】:2020-11-23 22:58:07
【问题描述】:
嘿,我正在使用 webflux 创建一个 rest api 用于学习目的,但我在登录页面遇到 bcrypt 密码匹配问题。
我的登录请求花费了额外的时间,当我挖掘更多时,我发现匹配功能是一项繁重的任务和耗时,我担心它会影响整个应用程序的性能
下面是我的代码
.filter(user -> {
long s = System.currentTimeMillis();
boolean matches = bCryptPasswordEncoder.matches(loginRequest.getPassword(), user.getPassword());
long e = System.currentTimeMillis();
System.out.println(e-s);
return matches;
})
我的整个 api 响应时间是 70 毫秒,时间差异是打印 62、63,这意味着匹配正在减慢我的整个应用程序。如果我一次收到 50 个登录请求怎么办?我想知道以非阻塞方式执行此操作的正确方法是什么。
【问题讨论】:
-
如果您使用的是spring security,那您为什么要自己匹配密码,而不是使用内置登录功能的框架?此外,70ms 相当快。您不想要快速密码匹配,因为恶意行为者可以使用它来快速尝试密码。 BCrypt 是一种所谓的“慢”算法,应该调整为在运行的系统上每秒匹配一次密码,以防止密码喷射攻击。
-
你可以在这里阅读更多关于密码的信息docs.spring.io/spring-security/site/docs/current/reference/…
-
但我的问题是匹配是否需要时间,并且由于我们处于有限线程上,它可能会暂停线程 60 毫秒,其他请求可能会受到影响。我错了吗?
-
可能取决于实现,如果是这种情况,那么它应该放在自己的调度程序上。除非您进行负载测试,否则无法确定。这就是为什么我仍然建议您使用内置的登录实现,不要尝试构建自己的。
标签: spring-security spring-webflux bcrypt project-reactor