Javascript HTML5离线身份验证

Javascript HTML5离线身份验证,javascript,html,security,authentication,encryption,Javascript,Html,Security,Authentication,Encryption,我正在寻求有关如何最好地控制对主要离线使用的HTML5应用程序的访问的建议/批评 该应用程序结合使用IndexedDB、本地和会话存储来存储数据,以便可以脱机使用。数据/页面通过HTTPS提供 目的是在平板电脑/个人电脑丢失/被盗的情况下,最大限度地降低查看数据的风险 目前,应用程序使用Stanford Javascript加密库对用户/密码进行加密,如果用户能够成功向服务器进行身份验证,则将其保存到本地存储。如果应用程序随后脱机,则用户必须根据本地存储中的加密用户/密码进行“本地”身份验证 此

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

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

目的是在平板电脑/个人电脑丢失/被盗的情况下,最大限度地降低查看数据的风险

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

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

我知道有很多关于客户端加密易出错的帖子/讨论,请参考和.nczonline.net/blog/2010/04/13/to-more-secure-client-side-data-storage/+其他。然而,我不确定这些论点在这种情况下是如何应用的

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

谢谢

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

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

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

在这一点上,选择javascript环境确实会妨碍您的工作,因为您无法在希望解密密钥消失时强制运行时环境丢弃它。这对于C应用程序来说已经足够困难了,因为您必须小心地将RAM交换到硬盘上。根据您的应用程序处理的信息的敏感程度,在用户完成后要求其关闭浏览器可能就足够了,并且假定攻击者没有足够的动机在浏览器的交换RAM中查找密钥

本地保存登录数据
因为它是您处理的最敏感的信息,所以您不应该将用户登录信息存储在客户端上。相反,只需对服务器进行一次身份验证,然后从服务器中检索身份验证令牌,以便将来进行交互。这与会话cookie基本相同,并在一段时间后过期(如果它根本没有过期,则与密码一样有效)。

我现在已经实现了一个解决方案,我将在下面介绍它,以防它对其他人有用。我理解这不是我问题的“答案”,即不提供评论,但考虑到应用程序必须“离线”工作以及无缝重新验证的要求,我看不出@Perseids answer可以如何实现,尽管我非常欣赏这段对话(来自@SilverlightFox和@Perseids)

如果有一个解决方案,在满足我的问题中概述的要求的同时,不必“离线”存储用户的凭据,我将非常希望听到


当应用程序处于“联机”和“脱机”状态时,应用程序必须能够对用户进行身份验证。对于“在线”应用程序,通常采用会话令牌解决方案,即客户端上只存储会话标识符(通常存储在cookie中),而不存储用户凭据。但是,用户的凭据必须存储在客户端上(也许有人会想出一个聪明的替代方案?),以便在应用程序脱机时实施安全性,即允许用户在脱机时进行身份验证并解密/加密IndexedDB数据。为了使应用程序更安全,用户的用户名和密码以加密形式存储。一些敏感的IndexedDB数据也以加密形式存储。因此,即使恶意用户通过缓存的应用程序实例获取计算机或平板电脑,他们也只能以加密形式查看用户名、密码和数据(前提是用户已注销或关闭浏览器)

不幸的是