本地存储中的安全浏览器端缓存

dec*_*tes 5 html javascript security caching local-storage

澄清一下问题:下面的提案是否被认为是“安全的”?(即不会引入任何重大的安全风险)。

我还没有看到任何明确的理由为什么以下提议会被认为是完全不安全的(例如,“不要打扰”,这似乎是对任何带有“本地存储”和“安全”字样的快速答案标题)。从根本上说,它基于以下前提:您可以访问内存和缓存中的敏感数据,或者您都不能访问。

起点

我有一个 web 应用程序,其中包括服务器端 web 服务和在浏览器中运行的 javascript,它调用这些 web 服务(安全地,通过 HTTPS,这不是这里的问题)并在网页中显示数据。假设它是一个显示您的电子邮件的电子邮件应用程序 - 即您不想与他人共享的敏感数据。

在此阶段需要注意以下几点:

  • 用户已通过服务器进行身份验证,浏览器中运行的 javascript 能够调用服务器的 Web 服务来检索数据。
  • 在浏览器中运行的 javascript 也可以访问该页面,并且该 javascript 可以使用所有(敏感)信息。敏感数据在“内存中”并且可供 javascript 使用(是的,包括任何恶意注入的 javascript)。

到目前为止,它是一个标准的 web 应用程序,我假设任何阅读的人都会感到舒服,因为它被认为是“可接受的安全”。

添加安全缓存?

问题是:每次用户访问该站点时,他们的浏览器都需要下载所有(电子邮件)信息,其中大部分信息每次都是相同的。如果不是每次都需要向服务器询问所有信息,而是可以在浏览器中缓存数据并检查缓存,那不是很好吗?请记住,这不是“离线”访问:浏览器仍在安全地与服务器通信,但它可能会使用存储在浏览器端缓存中的数据,而不是从服务器检索所有数据。

这是提案:

  • 当浏览器检索数据时,它还会检索一个长的、随机的、服务器生成的密钥。此密钥针对用户安全地存储在服务器上。
  • 在浏览器中,这个键位于 javascript 内存中的敏感数据旁边。
  • 浏览器使用服务器提供的密钥和公认的加密算法(例如 SHA256),对内存中的数据进行加密,然后将其放入本地存储中。
  • 当用户关闭浏览器、离开站点或“退出”时,浏览器不再显示敏感信息,密钥也随之丢失。
  • 这意味着一旦页面消失(或不久之后),浏览器或任何具有任何访问权限级别的人解密缓存内容的能力就消失了。为此,他们需要密钥:如果他们有密钥,他们就已经可以访问数据本身(在浏览器/javascript 内存中)。

  • 当用户稍后返回站点时,他们需要再次向服务器进行身份验证,以便通过 Web 服务检索数据。

  • 同时,javascript 从服务器检索(相同)密钥,它现在可以用来访问本地存储中的缓存。
  • 据推测,可能会有服务器随着时间的推移引入新密钥的过程,以避免无限期地使用相同的密钥。

有什么想法吗?

对于它的价值,请记住我已阅读:

(所以我至少知道围绕 javascript + 本地存储 + 安全性的担忧)

小智 0

安全和密码学是一个细节确实很重要的环境,请注意您的说法非常模糊。实施很容易出错。如果这是在商业应用程序中并且数据足够敏感,请考虑专业帮助。

但是,如果您打算尝试,请确保使用安全的加密密码来加密您的数据,否则您将面临特定于您的加密方法的攻击。请记住,设置默认值是为了简单,而不是为了安全。(例如分组密码中的 ECB 模式)

我绝不会建议使用不同的加密密钥加密 2 个相同的文本。考虑交错随机文本以使它们不相同

以下是像您这样的系统通常容易受到的一些攻击:

  • 选择密文攻击
  • 已知明文攻击
  • 随机数生成器攻击
  • 密文与明文长度相关性

您还需要确保此加密密钥不易受到 XSS 和其他标准互联网攻击。