我需要开发一个可长期离线运行的Web应用程序。为了使它可行,我无法避免将敏感数据(个人数据,而不是您将仅存储散列数据的类型)保存在本地存储中。
我接受不建议这样做,但是我几乎没有选择要执行以下操作来保护数据:
我很欣赏魔鬼在细节上的细节,并且知道人们对本地存储和基于JavaScript的安全性普遍持怀疑态度。任何人都可以评论是否存在:
谢谢你的帮助。
Web加密
客户端(浏览器)javascript中的加密问题将在下面详细介绍。除了所有这些关注点之外,所有关注点均不适用于WebCryptoAPI,该API现在得到了很好的支持。
对于脱机应用程序,您仍然必须设计和实现安全的密钥库。
另外:如果您使用的是Node.js,请使用内置的加密 API。
本机Java加密(WebCrypto之前的版本)
我认为主要的关注点是对计算机具有物理访问权限的人正在阅读localStorage您网站的,而您希望通过加密来防止这种访问。
localStorage
如果某人具有物理访问权限,那么您也很容易遭受其他攻击,这比读书更糟。这些包括(但不限于):键盘记录器,脱机脚本修改,本地脚本注入,浏览器缓存中毒和DNS重定向。仅当用户在计算机受到威胁后使用计算机时,这些攻击才起作用。但是,在这种情况下进行物理访问意味着您会遇到更大的问题。
因此请记住,如果机器被盗,则本地加密很有价值的局限性场景是。
有些库确实实现了所需的功能,例如StanfordJavascriptCryptoLibrary。但是,存在一些固有的弱点(如@ircmaxell的答案的链接所述):
这些弱点中的每一个都对应于一类密码妥协。换句话说,尽管您可能拥有“ crypto”的名字,但它远低于人们在实践中所追求的严格性。
综上所述,精算评估不如“ Javascript加密功能弱,不要使用它”那么简单。这不是背书,严格地是警告,它要求您完全了解上述弱点的风险,所面临媒介的频率和成本以及在发生故障时的缓解或保险能力:Javascript crypto,in尽管它有弱点,但可能会减少您的接触风险,但只能针对技术能力有限的小偷。但是,您应该假定Java加密对于以该信息为目标的坚定而有能力的攻击者没有价值。当已知实现中固有的许多弱点时,有些人会认为将数据称为“加密”是一种误导。换一种说法,您可以略微减少技术风险,但可以通过披露增加财务风险。当然,每种情况都是不同的- 减少将技术风险暴露于财务风险的分析并非易事。这是一个说明性的类比:尽管存在固有风险,但某些银行仍要求使用弱密码,因为它们所遭受的弱密码损失要小于支持强密码的最终用户成本。
如果您阅读了最后一段,并认为“互联网上某个叫Brian的人说我可以使用Java加密技术”, 请不要使用Java加密技术。
对于问题中描述的用例,用户加密本地分区或主目录并使用强密码似乎更有意义。这种类型的安全性通常经过良好测试,广泛信任并且普遍可用。