小编典典

是否可以将本地存储视为安全的?

html

我需要开发一个可长期离线运行的Web应用程序。为了使它可行,我无法避免将敏感数据(个人数据,而不是您将仅存储散列数据的类型)保存在本地存储中。

我接受不建议这样做,但是我几乎没有选择要执行以下操作来保护数据:

  • 使用斯坦福JavaScript加密库和AES-256将所有内容都加密到本地存储中
  • 用户密码是加密密钥,未存储在设备上
  • 通过ssl从单个受信任的服务器提供所有内容(在线时)
  • 使用owasp antisamy项目验证往返服务器本地存储的所有数据
  • 在appcache的网络部分中,不使用*,而是仅列出与受信任服务器连接所需的URI
  • 通常,尝试应用OWASP XSS备忘单中建议的指南

我很欣赏魔鬼在细节上的细节,并且知道人们对本地存储和基于JavaScript的安全性普遍持怀疑态度。任何人都可以评论是否存在:

  • 上述方法的根本缺陷?
  • 有什么办法可以解决此类缺陷?
  • html 5应用程序必须长时间离线运行时,还有什么更好的方法来保护本地存储?

谢谢你的帮助。


阅读 356

收藏
2020-05-10

共1个答案

小编典典

Web加密

客户端(浏览器)javascript中的加密问题将在下面详细介绍。除了所有这些关注点之外,所有关注点均不适用于WebCryptoAPI,该API现在得到了很好的支持。

对于脱机应用程序,您仍然必须设计和实现安全的密钥库。

另外:如果您使用的是Node.js,请使用内置的加密 API。

本机Java加密(WebCrypto之前的版本)

我认为主要的关注点是对计算机具有物理访问权限的人正在阅读localStorage您网站的,而您希望通过加密来防止这种访问。

如果某人具有物理访问权限,那么您也很容易遭受其他攻击,这比读书更糟。这些包括(但不限于):键盘记录器,脱机脚本修改,本地脚本注入,浏览器缓存中毒和DNS重定向。仅当用户在计算机受到威胁后使用计算机时,这些攻击才起作用。但是,在这种情况下进行物理访问意味着您会遇到更大的问题。

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

有些库确实实现了所需的功能,例如StanfordJavascriptCryptoLibrary。但是,存在一些固有的弱点(如@ircmaxell的答案的链接所述):

  1. 缺乏熵/随机数生成;
  2. 缺少安全的密钥库,即如果私钥存储在本地或存储在服务器上(禁止离线访问),则必须对其进行密码保护;
  3. 缺乏安全擦除;
  4. 缺乏时序特征。

这些弱点中的每一个都对应于一类密码妥协。换句话说,尽管您可能拥有“ crypto”的名字,但它远低于人们在实践中所追求的严格性。

综上所述,精算评估不如“
Javascript加密功能弱,不要使用它”那么简单。这不是背书,严格地是警告,它要求您完全了解上述弱点的风险,所面临媒介的频率和成本以及在发生故障时的缓解或保险能力:Javascript
crypto,in尽管它有弱点,但可能会减少您的接触风险,但只能针对技术能力有限的小偷。但是,您应该假定Java加密对于以该信息为目标的坚定而有能力的攻击者没有价值。当已知实现中固有的许多弱点时,有些人会认为将数据称为“加密”是一种误导。换一种说法,您可以略微减少技术风险,但可以通过披露增加财务风险。当然,每种情况都是不同的-
减少将技术风险暴露于财务风险的分析并非易事。这是一个说明性的类比:尽管存在固有风险,但某些银行仍要求使用弱密码,因为它们所遭受的弱密码损失要小于支持强密码的最终用户成本。

如果您阅读了最后一段,并认为“互联网上某个叫Brian的人说我可以使用Java加密技术”, 请不要使用Java加密技术。

对于问题中描述的用例,用户加密本地分区或主目录并使用强密码似乎更有意义。这种类型的安全性通常经过良好测试,广泛信任并且普遍可用。

2020-05-10