HTML5离线身份验证

use*_*458 10 javascript security authentication encryption html5

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

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

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

目前,该应用程序使用Stanford Javascript Crypto库来加密用户/密码,然后如果用户能够成功向服务器进行身份验证,则将其保存到本地存储.如果应用程序随后脱机,则用户必须对本地存储中的加密用户/密码进行"本地"身份验证.

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

我知道有关客户端加密错误的一些帖子/讨论,请参阅http://www.matasano.com/articles/javascript-cryptography/http://rdist.root.org/2010/11/29/final-post-on-javascript-crypto / and .nczonline.net/blog/2010/04/13/towards-more-secure-client-side-data-storage/+ others.但是我不确定这些参数在这种情况下是如何应用的.

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

谢谢

Per*_*ids 3

身份验证与安全存储

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

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

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

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

本地保存登录数据

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