离线 Web 应用程序中的用户身份验证

Posted

技术标签:

【中文标题】离线 Web 应用程序中的用户身份验证【英文标题】:User authentication in offline web apps 【发布时间】:2011-12-14 08:16:17 【问题描述】:

我正在构建一个需要离线工作的网络应用。该系统旨在捕获销售交易。大部分“离线”部分相当简单——我只需要在本地存储数据并在我回到网络时同步它。到目前为止,一切顺利。

问题在于身份验证。该应用程序将在具有单个操作系统用户帐户的共享计算机上运行。如果我处于离线状态,如何验证用户身份?

用户自己没有任何我需要隔离的私人数据(即,我不必在客户端上相互保护他们)。我需要能够验证他们的密码,这样即使连接断开,我也可以让不同的用户全天登录。

我正在考虑的一种方法是将客户端的密码哈希缓存在 IndexedDB 中。只有有限的一组用户被允许从特定的共享机器登录,所以我不需要在本地缓存我的整个密码数据库。假设我有一个好的密码策略(复杂性和到期要求)并且哈希本身是安全的(bcrypt),这个想法有多可怕?

我还有其他选择吗?

【问题讨论】:

据我所知,密码过期弊大于利——cryptosmith.com/node/218 不过,如果您要公开数据库,情况可能并非如此。 【参考方案1】:

当计算机无法访问域控制器时,这就是 Windows(和其他系统)的有效工作方式(例如,您将工作笔记本电脑带到飞机上并且需要在没有连接的情况下登录笔记本电脑)。您的机器已经记录了您的用户名|密码对的缓存,即使它处于离线状态,也会通过这些凭据让您进入。

我认为一般来说存储用户名|密码哈希是非常安全的,假设您正在合理地对它们进行哈希处理(例如,使用盐、使用 IV 等)。您需要考虑的一个问题是让哈希文件“转义”。如果这是敏感数据,你需要非常小心——这甚至可能是不可接受的,但如果它不是超级敏感数据,那么你可能没问题:通过良好的散列,我认为你应该是合理的(但肯定不是完全)安全。

【讨论】:

【参考方案2】:

也许这有点不相关,但我在我的 nodejs 项目中使用了这种方法。 当用户通过用户名和密码进行身份验证时,会为他/她分配一个唯一的 API 密钥,该密钥仅用于此特定会话。

每个用户只能拥有一个 API 密钥。

此 API 密钥会添加到对服务器发出的任何请求中,以验证用户身份。

当用户注销时,API 密钥被删除。还可以在服务器上清除 API 密钥,从而使用户在服务器上再次进行身份验证。

如果您有兴趣,我可以提供使用这种方法的 nodejs 开源程序的链接。

【讨论】:

我当然有兴趣,如果仍然愿意,请提供链接。 这篇文章是阅读staticapps.org/articles/authentication-and-authorization的好资源

以上是关于离线 Web 应用程序中的用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

存储用于离线身份验证的令牌

java- 哪种方式易于实现且安全,用于 Web 应用程序/Web 服务中的最终用户身份验证

当用户离线时,Firebase 身份验证会话会持续多长时间?

应用离线时如何绕过 Firebase 身份验证?

移动应用的身份验证令牌,是不是存在离线暴力破解漏洞?

为 iOS 应用程序中的 Facebook 身份验证设计,该应用程序还访问安全的 Web 服务