HTML5离线认证

2023-12-30

我正在寻求有关如何最好地控制对主要离线使用的 HTML5 应用程序的访问的建议/批评。

该应用程序使用 IndexedDB、本地和会话存储的组合来存储数据,以便可以离线使用。数据/页面通过 HTTPS 提供。

目的是最大限度地降低平板电脑/个人电脑丢失/被盗时数据被查看的风险。

目前,该应用程序使用斯坦福 Javascript 加密库来加密用户/密码,然后在用户能够成功通过服务器身份验证时将其保存到本地存储。如果应用程序随后离线,用户必须根据本地存储中的加密用户/密码进行“本地”身份验证。

此外,如果用户能够成功向服务器进行身份验证,则未加密的用户/密码将存储在会话存储中。这样应用程序就可以定期尝试与服务器重新建立联系并“无缝”重新进行身份验证,而无需用户重新输入其凭据。

我知道许多关于客户端加密的错误的帖子/讨论请参阅http://www.matasano.com/articles/javascript-cryptography/ http://www.matasano.com/articles/javascript-cryptography/ and http://rdist.root.org/2010/11/29/final-post-on-javascript-crypto/ http://rdist.root.org/2010/11/29/final-post-on-javascript-crypto/和 .nczonline.net/blog/2010/04/13/towards-more-secure-client-side-data-storage/ + 其他。但是我不确定这些论点如何适用于这种情况。

鉴于需要离线存储数据,我正在寻找对该方法的批评。如果有更好的方法请详细说明。

Thanks


身份验证与安全存储

我将从大的设计问题开始:你似乎处理这个问题就好像它是关于验证,其中(可能是恶意的)用户需要向您的应用程序证明她确实是有效用户。但实际上你面临的是storage问题,因为如果计算设备被盗,则包含应用程序正在使用的所有敏感信息的整个运行时环境都掌握在攻击者手中。在 JavaScript 应用程序的情况下,离线数据和代码的分析甚至比某些仅二进制代码的情况更舒适。

例如,如果我想攻击您的应用程序,我会首先查看会话存储(cookie?只需使用浏览器界面查找它们),看看是否可以在那里找到用户名和密码。如果不是,我将遵循用于解密本地存储中的密码的代码(可能使用 javascript 调试器)。根据您描述应用程序的方式,这些函数似乎可以在没有用户提供密钥的情况下解密它。也许我可以通过更改类似的内容来注释掉用户的本地身份验证if(authenticateUser()) to if(true).

因此,您真正需要做的是使用根本不存储在客户端的密钥来加密所有敏感的本地数据。例如,每次用户访问您的应用程序时都要求用户提供解密密钥,使用该密钥解密本地存储的数据(并加密您存储的每个新数据)以及闲置一段时间后将钥匙扔掉。或者,您可以在用户每次访问您的应用程序时对服务器进行身份验证,并从那里检索解密密钥,并在一段时间不活动后将其丢弃。

此时,JavaScript 环境的选择确实会阻碍您的事业,因为当您想要解密密钥消失时,您无法强制运行时环境丢弃它。即使对于 C 应用程序来说,这也足够困难了,因为您必须小心地将 RAM 交换到 HDD 上。根据应用程序使用的信息的敏感程度,要求用户在完成后关闭浏览器并假设攻击者没有足够的动机在浏览器的换出 RAM 中查找密钥可能就足够了。

本地保存登录数据

由于它是您使用的最敏感信息,因此您永远不应该将用户登录信息存储在客户端上。相反,对服务器进行一次身份验证,并从中检索身份验证令牌以供将来的交互使用。这与会话 cookie 基本相同,并且会在一段时间后过期(如果它根本没有过期,则它与密码一样有效)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5离线认证 的相关文章

随机推荐