我希望提高在负载下将大部分处理时间用于身份验证过程(用户名/密码验证)的应用程序的性能。
我对应用程序密码的存储和验证方式(经过多次迭代加盐和散列)感到满意,问题是身份验证过程很慢并且 CPU 很饿(应该是这样)。
应用程序会收到大量消息,并且传入的每条消息都经过身份验证。具体来说,我正在做的是实现一个短期缓存(120 秒),如果用户名/密码成功通过身份验证,那么在缓存窗口期间进入的具有相同用户名/密码的任何其他请求都将通过身份验证,而无需经历缓慢的多次迭代认证过程。
基本流程将是:
- 检查用户名是否有效且帐户未锁定(暂停/重试次数过多/密码最近更改)
- 检查缓存以查看用户名/密码条目是否存在
- 缓存中没有条目:通过身份验证算法传递提供的密码,并与存储在数据库中的值进行比较。如果匹配,则对用户进行身份验证并将条目添加到缓存中
- 缓存中的条目:提供的用户名/密码与在缓存窗口中验证的用户名/密码相同,因此验证用户。
- 缓存会自动过期条目
缓存将是内存中的缓存,但我的问题是我需要如何“安全”才能使我放置在缓存中的数据(用户名/密码)。它是性能和安全性之间的权衡……以及足够安全的安全性。
例如,以下是用于缓存的合理键:
- 用户名 + 哈希(盐 + 密码)