HTML5 sessionStorage 对于临时存储加密密钥是否安全?

信息安全 密码学 密钥管理 会话管理 html-5
2021-08-13 19:23:50

假设我正在用 HTML5 构建本地 Web 应用程序(例如浏览器扩展)来加密本地数据库。对数据库的访问由密码控制,密码主密钥是使用 PBKDF 从密码中派生的。我只想在应用程序正在使用时将派生的主密钥存储在内存中,以便我可以根据需要加密和解密记录。

我已经研究过为此目的使用sessionStorage 。优点是密钥应该只在内存中并且对当前浏览器选项卡可用。如果该选项卡或浏览器已关闭,则应删除该密钥。优点是,如果您需要刷新浏览器选项卡,它仍然具有活动会话和主密钥,否则您需要在每次刷新时重新输入密码。刷新可能很少发生,因为它是一个单页应用程序。

在阅读 W3C 上的 sessionStorage 规范时,有一些担忧:

浏览上下文的生命周期可能与实际用户代理进程本身的生命周期无关,因为用户代理可能支持在重启后恢复会话。

这是在谈论操作系统重启还是浏览器重启?

绝对想避免的是将加密密钥写入很难摆脱的磁盘。上面的引用是否表示 sessionStorage 中的密钥有可能作为崩溃恢复/重启过程的一部分存储在磁盘上?或者这个重启过程通常只在内存中处理?

a)有没有人知道第 1 层开源浏览器(Firefox、Chromium)如何处理 sessionStorage 以及内容是否可以写入磁盘,即使在浏览器崩溃的情况下也是暂时的?

b)是否有任何缓解措施来防止在浏览器崩溃或重新启动时将密钥泄露到磁盘?浏览器崩溃后是否有任何about:config设置可用于禁用会话恢复

c)完全不使用 sessionStorage 存储密钥是最安全的选择吗?或者也可以通过使用全盘加密来降低风险?

谢谢你的帮助。

2个回答

简而言之; 浏览器重启。然而,并不是每个浏览器都以相同的方式实现 W3C 定义的规范。

a) 有没有人知道第 1 层开源浏览器(Firefox、Chromium)如何处理 sessionStorage 以及内容是否可以写入磁盘,即使是在浏览器崩溃的情况下也是暂时的?

它没有提到保存当时驻留在 sessionStorage 中的数据。您需要研究每个浏览器的实现才能确定。

请参阅Mozilla 的文档,还有一个错误/功能请求将此功能迁移到 sqlite 数据库。

b) 是否有任何缓解措施来防止在浏览器崩溃或重新启动时将密钥泄露到磁盘?是否有任何 about:config 设置可用于在浏览器崩溃后禁用会话恢复?

虽然每个浏览器的扩展 API 会有所不同,但每个浏览器都应该实现一些错误处理,以及崩溃时的事件触发器。

例如,Google Chrome 的文档使用了不符合W3C 进度事件标准RFC 文档的崩溃事件触发器。

c) 完全不使用 sessionStorage 存储密钥是最安全的选择吗?或者也可以通过使用全盘加密来降低风险?

您不需要存储派生密钥,一旦记录在会话期间被解密并写入 DOM,密钥应该只需要保留到会话结束时加密发生。使用SessionStorage才能在选项卡/浏览器打开时维护DOM中的数据,因此名称“会话”。

话虽如此,如果您确实需要安全防护并认为全盘加密可以缓解该问题,请考虑以下情况:

  1. 访问全盘加密机器的引导分区将允许修改 initramfs(linux 安装),从而允许捕获用于磁盘加密的输入提供的密钥的方法。
  2. 用于将 Web 应用程序传输到客户端浏览器的传输如果未包装在 TLS 等加密协议中,则可能允许注入能够捕获键盘输入的恶意代码。请参阅BeEF注射工具包。

我写了这个工具;secStore.js它完成了你所说的完成。只需确保使用加密隧道包装传输层,使用安全标头来缓解 XSS 尝试,甚至可以查询加载的浏览器插件/扩展程序以防止使用该途径进行恶意攻击。

希望有帮助。任何具有安全性的东西都应该分层,几乎不可能覆盖所有可以使用监控的攻击向量。

显然,关闭选项卡时 sessionStorage 并没有真正清除。单击“重新打开已关闭的选项卡”可以轻松恢复它

我在这里写了更多关于它的内容:http: //blog.guya.net/2015/08/25/the-never-ending-browser-sessions/