即使在服务器端数据库受损后也能安全地进行 Web 用户身份验证

信息安全 Web应用程序 验证 饼干
2021-08-19 05:46:22

到目前为止,我们应该都知道使用 bcrypt 或 scrypt 来存储足够多轮数的加盐密码哈希。(例如,请参阅https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) 教训:假设您的身份验证数据库将在某个时候受到损害。

我们还应该知道如何设计用户身份验证 cookie,以满足我们的应用程序使用具有每个用户密钥的 HMAC 所需的安全性和机密性级别。我见过的最常被引用的论文是http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf

然而,我读过的每一篇解决安全用户身份验证的论文和提案都解决了一组不同的、重叠的问题(例如,窃听、篡改和重放攻击),并且通常也旨在存储对用户不透明的数据。

即使在服务器的身份验证数据库遭到破坏后,我也找不到任何解决如何使客户端用户身份验证 cookie 抵抗攻击的方法。

例如,上面的论文只是依赖于服务器密钥的保密性。我见过的许多实现也会生成一个用于 HMAC 并存储在服务器上的每用户令牌。在任何一种情况下,一旦服务器机密被泄露,伪造任何用户的凭据都是微不足道的。

对于典型的 Web 应用程序(即,在公司和银行环境之外),是否有任何参考或已知实现涵盖此场景?

1个回答

如果整个服务器被攻破,那么无论服务器能做什么,攻击者也能做到。

因此,获得用户身份验证以抵抗整个服务器妥协的唯一方法是将身份验证基于用户可以执行但服务器不能执行的操作,但这样服务器可以验证用户是否正在执行此操作。这需要数字签名用户应该以某种方式将私钥存储在他机器上的某个地方,并使用它来签署服务器发送的某种挑战。

不应从 Javascript 访问私钥;否则,攻击者可能会植入一些 Javascript 代码来检索用户的私钥。在 Web 上下文中,数字签名但没有服务器发送的代码,这指向用户证书

这是可以做到的。此外,这完成的(我看到一些银行使用它,向他们的客户颁发证书)。SSL 支持客户端证书,并且最近的浏览器版本在使用它们时变得几乎用户友好。您甚至可以分发智能卡(或插入 USB 端口的等效小工具,以简化安装)。