假设我正在用 HTML5 构建本地 Web 应用程序(例如浏览器扩展)来加密本地数据库。对数据库的访问由密码控制,密码主密钥是使用 PBKDF 从密码中派生的。我只想在应用程序正在使用时将派生的主密钥存储在内存中,以便我可以根据需要加密和解密记录。
我已经研究过为此目的使用sessionStorage 。优点是密钥应该只在内存中并且对当前浏览器选项卡可用。如果该选项卡或浏览器已关闭,则应删除该密钥。优点是,如果您需要刷新浏览器选项卡,它仍然具有活动会话和主密钥,否则您需要在每次刷新时重新输入密码。刷新可能很少发生,因为它是一个单页应用程序。
在阅读 W3C 上的 sessionStorage 规范时,有一些担忧:
浏览上下文的生命周期可能与实际用户代理进程本身的生命周期无关,因为用户代理可能支持在重启后恢复会话。
这是在谈论操作系统重启还是浏览器重启?
我绝对想避免的是将加密密钥写入很难摆脱的磁盘。上面的引用是否表示 sessionStorage 中的密钥有可能作为崩溃恢复/重启过程的一部分存储在磁盘上?或者这个重启过程通常只在内存中处理?
a)有没有人知道第 1 层开源浏览器(Firefox、Chromium)如何处理 sessionStorage 以及内容是否可以写入磁盘,即使在浏览器崩溃的情况下也是暂时的?
b)是否有任何缓解措施来防止在浏览器崩溃或重新启动时将密钥泄露到磁盘?浏览器崩溃后是否有任何about:config设置可用于禁用会话恢复?
c)完全不使用 sessionStorage 存储密钥是最安全的选择吗?或者也可以通过使用全盘加密来降低风险?
谢谢你的帮助。