【发布时间】:2014-02-05 06:21:40
【问题描述】:
为了明确问题:下面的提案是否被认为是“安全的”? (即不会引入任何重大的安全风险)。
我还没有看到任何明确的理由说明为什么以下提议会被认为是完全不安全的(例如,“不要打扰”,这似乎是对任何带有“本地存储”和“标题中的“安全”)。从根本上说,它基于以下前提:要么您可以访问内存和缓存中的敏感数据,要么您都无法访问。
起点
我有一个 Web 应用程序,其中包括服务器端 Web 服务和在浏览器中运行的 javascript,它调用这些 Web 服务(安全地,通过 HTTPS,这不是这里的问题)并在网页中显示数据。假设它是一个显示您的电子邮件的电子邮件应用程序 - 即它是您不想与他人共享的敏感数据。
现阶段需要注意的几点:
- 用户已通过服务器验证,并且在浏览器中运行的 javascript 能够调用服务器的 Web 服务来检索数据。
- 在浏览器中运行的 javascript 也可以访问该页面,并且所有(敏感)信息都可用于该 javascript。敏感数据“在内存中”并且可供 javascript 使用(是的,包括任何恶意注入的 javascript)。
到目前为止,它是一个标准的网络应用程序,我假设任何阅读的人都会觉得这被认为是“可以接受的安全”。
添加安全缓存?
问题是:每次用户访问网站时,他们的浏览器都需要下载所有的(电子邮件)信息,而且每次的大部分信息都是相同的。如果不需要每次都向服务器询问所有信息,它可以将数据缓存在浏览器中并检查缓存,这不是很好吗?请记住,这不是“离线”访问:浏览器仍在与服务器安全通信,但它可能会使用存储在浏览器端缓存中的数据,而不是从服务器中检索所有数据。
建议如下:
- 当浏览器检索数据时,它还会检索一个长的、随机的、服务器生成的密钥。此密钥针对用户安全地存储在服务器上。
- 在浏览器中,此密钥位于 javascript 内存中的敏感数据旁边。
- 浏览器使用服务器提供的密钥和可接受的加密算法(例如 SHA256),对内存中的数据进行加密,并将其放入本地存储中。
- 当用户关闭浏览器、离开网站或“注销”时,浏览器不再显示敏感信息,密钥也随之丢失。
这意味着一旦页面消失(或不久之后),浏览器或任何具有任何访问权限的人解密缓存内容的能力都将消失在本地存储中.为此,他们需要密钥:如果他们有密钥,他们就已经可以访问数据本身(在浏览器/javascript 内存中)。
当用户稍后返回站点时,他们需要再次向服务器进行身份验证,以便通过 Web 服务检索数据。
- 同时,javascript 从服务器检索(相同的)密钥,现在可以使用该密钥访问本地存储中的缓存。
- 据推测,服务器可能会随着时间的推移引入新密钥,以避免无限期使用相同的密钥。
有什么想法吗?
对于它的价值,请记住我已阅读:
(所以我至少知道关于 javascript + 本地存储 + 安全性的担忧)
【问题讨论】:
-
当您的页面使用 HTTPS 时,很可能无法使用浏览器缓存,因为有些浏览器默认情况下不缓存 HTTPS 资源。
-
有道理,@CBroe。没有建议使用浏览器缓存(也称为“临时 Internet 文件”等),因为这将涉及以非加密形式存储在磁盘上的原始敏感数据,这是不可接受的。
标签: javascript html security caching local-storage