不时地,此版块中会出现有关使用客户端加密(或“浏览器内”加密)的 Web 应用程序的问题,这些应用程序声称这些应用程序的设计方式使得这些应用程序的操作员拥有“零” -访问'用户的私人信息。请参阅下面几个相关问题的链接。此类应用程序的一个常见示例是Protonmail,它旨在提供端到端的加密电子邮件。 Protonmail 声称“您的数据以一种我们无法访问的方式加密”,并且“数据在客户端使用我们无权访问的加密密钥进行加密”。
在围绕这个主题的讨论中,‘browser crypto chicken-and-egg problem’
经常出现。该术语由安全研究员 Thomas Ptacek 于 2011 年创造。本质上,问题是:如果你不能信任服务器提供你的秘密,那么你怎么能信任服务器提供安全的加密代码?以 Protonmail 为例,有人可能会争辩说,流氓 Protonmail 服务器管理员(或已获得对 Protonmail 服务器的访问权限的攻击者)可以更改 Protonmail 服务器提供的客户端 JavaScript 代码,以便该代码捕获用户的私钥或明文信息并将这些秘密发送回服务器(或其他地方)。
这个问题是:可以使用以下方法解决“浏览器加密鸡蛋问题”吗?
Web 应用程序设计为单页 Web 应用程序。静态网页在用户会话开始时提供,并且该静态页面在整个用户会话期间保持加载在用户浏览器中。像 Protonmail 一样,所有的加密都是在浏览器中完成的——用户的明文秘密和私人加密密钥永远不会离开浏览器,只有密文被发送到服务器。然而,与 Protonmail 不同,Protonmail 在用户每次操作后由服务器动态生成一个新页面——用户的请求通过客户端AJAX或XHR调用从静态页面发送到服务器,并且使用服务器对这些调用的响应来更新静态页面。
静态页面依赖的所有支持文件(例如 javascript 文件、css 文件等)都由静态页面使用子资源完整性引用。
用户的私有加密密钥(或从中派生出私有密钥的密码)由用户存储。用户通过静态页面上的界面输入他们的私钥(或密码),然后将密钥传递给在浏览器中运行的客户端脚本。所有浏览器内加密都由浏览器的本机Web Crypto API 处理。
为了缓解 XSS 攻击,所有外部内容在写入静态页面之前都在客户端脚本中进行了清理;所有外部内容都使用元素的 .innerText 属性(与 .innerHTML 相对)写入静态页面元素,并且应用了严格的内容安全策略(CSP),禁止使用内联脚本。
受信任的审阅者 (TR) 审阅静态页面和所有支持文件。TR 确定客户端代码“如广告”,并且客户端代码在任何时候都不会将用户的秘密发送回服务器(或其他任何地方),并且在任何时候静态页面都不会请求新页面来自服务器,并且以上所有内容都已正确实施。然后 TR 用他的私有签名密钥对静态页面进行签名并将签名公开。
用户将他的浏览器指向静态页面。然后,用户单击其网络浏览器上的“页面另存为”功能,以将静态页面(当前加载在他的浏览器中)保存到他的系统中。他使用 TR 的公钥验证 TR 在静态页面上的签名。如果签名被验证,那么用户通过已经加载在他的网络浏览器中的静态页面继续使用该服务。
总结一下:经过 TR 审核和签名的静态页面在整个用户会话期间始终加载在用户的浏览器中,并且在任何时候都不会被服务器的新页面替换。用户在其会话开始时通过使用 TR 的公钥验证该页面的 TR 签名来验证静态页面的完整性(以加密方式,以类似于通常验证可下载文件的完整性的方式)。[如果浏览器(或者浏览器扩展)有一个内置的方法来执行这个功能会很好,但是在那一天到来之前,上面第 6 步的过程就足够了]。在步骤 2 中使用子资源完整性 (SRI) 可确保攻击者无法修改支持文件,因为这样做会破坏 SRI 检查,或者需要更改根文档,
对于这个问题,假设 TR 有能力执行手头的任务,并且用户有一种可靠的方法(例如,通过受信任的第三方或一些带外方法)来验证 TR 的公钥是否真实和正确. 另外,为了这个问题,请抛开旁道攻击的可能性,例如浏览器漏洞、TR 设备或用户设备被盗、TR 私钥或用户私钥被盗等。
鉴于上述情况,您能想出某种方式让流氓服务器管理员(或已获得服务器访问权限的黑客)能够窃取用户的秘密,如果可以,怎么做?
有关的:
- protonmail 可以访问我的密码并因此访问我的秘密吗?
- 2017 年浏览器内密码学有什么问题?
- 浏览器加密问题
- 如何证明客户端 Javascript 是安全的?
- 如何在零知识模型中验证客户端安全性
- 为什么 Signal 没有网络客户端?
- index.html 完整性
- 浏览器中的 Javascript 加密
- 基于 HTTPS/TLS 的端到端加密
2021 年 2 月 27 日编辑
我为 Firefox开发了一个小型浏览器扩展,结合了这个问题中的许多想法以及以下答案和回复,旨在解决这个问题。有关更多信息,请参阅下面的答案。