Html 本地存储可以被认为是安全的吗?

Html 本地存储可以被认为是安全的吗?,html,security,local-storage,html5-appcache,Html,Security,Local Storage,Html5 Appcache,我需要开发一个长期离线运行的web应用程序。为了实现这一点,我无法避免将敏感数据(个人数据,但不是您仅将散列存储的数据)保存在本地存储中 我承认这不是推荐的做法,但由于别无选择,我将采取以下措施来保护数据: 使用stanford javascript加密库和AES-256将所有内容编入本地存储 用户密码是加密密钥,不存储在设备上 通过ssl从单个受信任服务器提供所有内容(联机时) 使用owasp antisamy项目验证服务器上进出本地存储的所有数据 在appcache的网络部分中,不使用*,

我需要开发一个长期离线运行的web应用程序。为了实现这一点,我无法避免将敏感数据(个人数据,但不是您仅将散列存储的数据)保存在本地存储中

我承认这不是推荐的做法,但由于别无选择,我将采取以下措施来保护数据:

  • 使用stanford javascript加密库和AES-256将所有内容编入本地存储
  • 用户密码是加密密钥,不存储在设备上
  • 通过ssl从单个受信任服务器提供所有内容(联机时)
  • 使用owasp antisamy项目验证服务器上进出本地存储的所有数据
  • 在appcache的网络部分中,不使用*,而是仅列出与受信任服务器连接所需的URI
  • 通常,尝试应用OWASP XSS备忘单中建议的指导原则
我明白魔鬼往往在细节中,并且知道人们普遍对本地存储和基于javascript的安全性持怀疑态度。有谁能评论一下是否有:

  • 上述方法的根本缺陷
  • 有没有可能解决这些缺陷
  • 当HTML5应用程序必须长期脱机运行时,有没有更好的方法来保护本地存储

谢谢你的帮助。

好吧,这里的基本前提是:不,它还不安全

基本上,您不能在JavaScript中运行crypto:

问题是你不能可靠地将加密代码输入到浏览器中,即使你可以,JS也不能让你安全地运行它。因此,除非浏览器有一个加密容器(加密媒体扩展提供了这个容器,但为了DRM的目的正在与之对抗),否则就不可能安全地实现

至于“更好的方法”,目前还没有。您唯一的选择是以纯文本形式存储数据,并希望得到最好的结果。或者根本不存储信息。不管怎样

或者,如果您需要这种安全性,并且需要本地存储,请创建一个自定义应用程序…

WebCrypto 下面详细介绍了客户端(浏览器)javascript中的加密问题。除了其中一个问题外,所有这些问题都不适用于现在的美国

对于离线应用程序,您仍然必须设计并实现安全密钥库

旁白:如果您使用的是Node.js,请使用内置API

本机Javascript加密(预WebCrypto) 我认为主要的问题是有人可以物理访问您的站点的
localStorage
,而您需要加密技术来帮助阻止这种访问

如果有人有身体接触,你也会受到比阅读更糟糕的攻击。这些包括(但不限于):键盘记录器、脱机脚本修改、本地脚本注入、浏览器缓存中毒和DNS重定向。只有当用户在机器被破坏后使用机器时,这些攻击才会起作用。然而,在这种情况下,物理访问意味着您有更大的问题

因此请记住,如果机器被盗,本地加密有价值的有限场景将是

有些库确实实现了所需的功能,例如。但也有一些固有的弱点(如@ircmaxell回答中的链接所述):

  • 缺乏熵/随机数生成
  • 缺乏安全密钥库,即如果私钥存储在本地或存储在服务器上(禁止脱机访问),则必须对其进行密码保护
  • 缺乏安全擦除
  • 缺乏定时特性
  • 这些弱点中的每一个都对应于一类密码泄露。换句话说,虽然你可能有“加密”的名字,但它将远远低于人们在实践中渴望的严格程度

    尽管如此,精算评估并不像“Javascript加密很弱,不要使用它”那样微不足道。这不是一种认可,严格地说是一种警告,它要求您完全了解上述弱点的暴露、您面临的向量的频率和成本,以及您在发生故障时的缓解或保险能力:Javascript crypto,尽管存在弱点,可能会减少您的暴露,但仅针对技术能力有限的窃贼。但是,您应该假定Javascript crypto对以该信息为目标的坚定且有能力的攻击者没有任何价值。有些人会认为它误导数据“加密”时,已知有许多弱点是固有的实施。换句话说,你可以稍微减少你的技术风险,但你可以通过披露增加你的财务风险。当然,每种情况都是不同的——减少技术风险和财务风险的分析是非常重要的。这里有一个说明性的类比:,尽管存在固有的风险,因为他们因弱密码而遭受的损失小于支持强密码的最终用户成本


    作为对本主题的探索,我有一个题为“使用Web加密API保护TodoMVC”的演示文稿(,)

    它使用来存储通过密码保护应用程序并使用密码派生密钥进行加密而在localStorage中加密的todo列表。如果忘记或丢失密码,则无法恢复。(免责声明-它是POC,不用于生产。)

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

    最后,加密localStorage可能只会保护数据免受attac攻击