本地存储能否被认为是安全的?

我需要开发一个能长时间离线运行的Web应用程序。 为了实现这一点,我无法避免在本地存储中保存敏感数据(个人数据,而不是只存储散列的数据)。

我接受这不是build议的做法,但给了我很less的select,我正在做以下事项以确保数据:

  • 使用斯坦福的JavaScriptencryption库和AES-256encryption本地存储的所有内容
  • 用户密码是encryption密钥,不存储在设备上
  • 通过ssl从单个受信任的服务器提供所有内容(当在线时)
  • 使用owasp antisamy项目validation服务器上本地存储的所有数据
  • 在appcache的networking部分中,不使用*,而是仅列出与受信任的服务器连接所需的URI
  • 一般都试图应用OWASP XSS备忘单中提出的指导原则

我明白,魔鬼往往是在细节,并知道有很多关于本地存储和基于JavaScript的安全性的一般怀疑。 任何人都可以评论是否有:

  • 上述方法的根本缺陷?
  • 任何可能的解决scheme,这样的缺陷?
  • 当html5应用程序必须长时间离线工作时,有什么更好的方法来保护本地存储?

感谢您的帮助。

那么,这里的基本前提是:不,现在还不安全。

基本上,你不能在JavaScript中运行encryption: JavaScriptencryption被认为是有害的 。

问题是你不能可靠地把encryption代码join到浏览器中,即使你可以,JS也不能让你安全地运行它。 因此,除非浏览器拥有一个encryption容器(这些encryption媒体扩展提供了encryption容器,但是由于DRM的目的,这些容器正在被聚合在一起),所以不可能做到安全。

就“更好的方式”而言,目前还没有一个。 你唯一的select是以纯文本存储数据,并希望最好的。 或根本不存储信息。 无论哪种方式。

无论是,或者如果你需要这种安全性,并且你需要本地存储,创build一个自定义的应用程序…

我认为主要关心的是能够物理访问计算机的人读取您的站点的localStorage ,并且您希望密码学帮助阻止访问。

如果有人有实际访问权限,你也可以攻击其他人,比阅读更糟糕。 这些包括(但不限于):键盘logging器,脱机脚本修改,本地脚本注入,浏览器caching中毒和DNSredirect。 这些攻击仅在用户使用机器受到攻击后才起作用。 尽pipe如此,在这种情况下的物理访问意味着你有更大的问题。

所以请记住,如果机器被盗,局部密码有价值的有限情况就是这样。

有一些库可以实现所需的function,例如Stanford Javascript Crypto Library 。 有一些固有的弱点,但是(从@ ircmaxell的回答中可以看出):

  1. 缺乏熵/随机数生成;
  2. 缺less一个安全的密钥库,例如,私钥在本地存储或者存储在服务器上(这些禁止离线访问)必须受密码保护;
  3. 缺乏安全擦除;
  4. 缺乏时间特征。

这些弱点中的每一个都与一类密码协调相对应。 换句话说,虽然你可能有名字的“密码”,但它将远低于你在实践中渴望的严格性。

WebCrypto API可能会解决这些问题,但目前还没有。

所有这一切,精算评估并不像“Javascriptencryption弱,不要使用它”一样微不足道。 这不是一个背书,而是一个警告,它要求你完全理解上述弱点的暴露,你面临的载体的频率和成本,以及你在失败的情况下缓解或保险的能力:Javascript crypto,in尽pipe它的弱点,可能会减less你的曝光,但只有技术能力有限的盗贼。 然而,你应该认为Javascriptencryption对于一个确定的,有能力的攻击者来说是没有价值的。 有些人认为,如果知道实施中固有的很多弱点,就会把这些数据称为“encryption的”。 换句话说,你可以稍微降低你的技术风险,但是你增加了披露的财务风险。 当然,每一种情况都不一样 – 减less技术风险暴露的分析并不是微不足道的。 以下是一个说明性的比喻:尽pipe存在固有的风险, 一些银行需要较弱的密码 ,因为由于密码较弱而遭受损失的风险小于最终用户支持强密码的成本。

🔥如果您阅读了最后一段,并且认为“互联网上的一些名为Brian的人说我可以使用Javascriptencryption”, 请不要使用Javascriptencryption。

对于这个问题中描述的用例来说,用户encryption本地分区或主目录并使用强密码似乎更有意义。 这种types的安全性通常经过了充分的testing,广泛的信任和普遍的可用性。

作为这个主题的探索,我有一个名为“使用WebencryptionAPI保护TodoMVC”( video , 代码 )的演示文稿。

它使用WebencryptionAPI存储在localStorage中encryption的待办事项列表,通过密码保护应用程序并使用密码派生密钥进行encryption。 如果您忘记或丢失密码,则无法恢复。 ( 免责声明 – 这是一个POC,不适用于生产用途。

在其他答案状态下,这仍然容易受XSS或客户端计算机上安装的恶意软件的影响。 但是,当数据存储在服务器上并且应用程序正在使用时,任何敏感数据也将在内存中。 我build议离线支持可能是引人注目的用例。

最后,encryptionlocalStorage可能只保护那些只能读取系统或其备份的攻击者的数据。 它为OWASP前10个项目A6敏感数据曝光添加了less量防御,并允许您回答“这些数据是否长期存储在明文中? 正确。

这里是一篇非常有趣的文章。 我正在考虑在使用本地存储时实现JSencryption来提供安全性。 这是非常明显的,这只会提供保护,如果设备被盗(并正确实施)。 它不会提供对键盘logging器等的保护。但是,这不是一个JS问题,因为键盘logging程序威胁是所有应用程序的问题,无论它们的执行平台(浏览器,本机)如何。 对于第一个答案中引用的文章“JavaScript Crypto Considered Harmful”,我有一个批评, 它指出“你可以使用SSL / TLS来解决这个问题,但这是昂贵和复杂的”。 我认为这是一个非常雄心勃勃的主张(可能有点偏颇)。 是的,SSL有成本,但是如果考虑为多个操作系统开发原生应用程序的成本,而不是基于Web的原因,则SSL的成本变得微不足道。

我的结论 – 客户端的encryption代码有一个地方,但是对于所有的应用程序,开发人员必须认识到它的局限性,如果适合他们的需求,还要确保有方法来减轻风险。

无法访问任何网页(true),但可通过开发工具轻松访问和轻松编辑,例如chrome(ctl-shift-J)。 因此,在存储值之前需要自定义encryption。

但是,如果JavaScript需要解密(validation)解密algorithm是暴露的,可以操纵。

Javascript需要一个完全安全的容器,并且能够正确实现只有js解释器才能使用的私有variables和函数。 但是,这违反了用户的安全 – 因为跟踪数据可以不受惩罚地使用。

因此,JavaScript永远不会完全安全。

没有。

localStorage可以通过任何网页访问,如果你有密钥,你可以改变任何你想要的数据。

也就是说,如果你可以devise一种方法来安全地encryption密钥,那么传输数据的方式并不重要,如果你可以在一个闭包中包含数据的话,那么数据是有点安全的。