用于用户身份验证的 Javascript 有效负载加密安全方法

在与我的同事 @owengot 讨论后,以下是该问题的更详细描述。

这是一个基于 Vue.js 的 Web 应用程序,它没有自己独立的服务器端组件。相反,它是一个独立的 Web 应用程序,使用 Discourse API,因此在某种意义上,Discourse 充当了服务器。使用场景包括独立的投票或表单,其中内容会以用户账户的名义发布到 Discourse 主题中。能够创建此类软件而无需自定义服务器端组件,似乎对于这些用例来说是一种不错的架构,因此理想情况下我们希望避免任何“服务器端”操作。

现在,获取 User-API 密钥可以按预期工作,但 @owengot 发现,在 JavaScript 中生成私钥的步骤非常耗时(长达 10 秒,这在 JavaScript 中效率很低……)。随后,他发现了一个技巧:同一个私钥可以用于多个用户,因此他将该私钥存储在 Web 主机上的一个文件中,该主机也提供 Web 应用程序的其他静态文件(JS、CSS 等)。这样确实很快……但现在这个私钥(1)是共享的,并且(2)以公开的 URL 形式存储,暴露在公开环境中。这听起来,嗯,令人担忧 :fearful:

因此,我说我们必须向 Discourse 团队咨询这种技巧的安全影响。我看到两个基本替代方案:

  • 如果该私钥“仅”用于有效载荷加密,那么我们可以接受这种情况,因为我们的通信也通过 SSL/HTTPS 进行了加密。

  • 但是,如果知道该私钥能够以某种方式计算出随后用于在某个人的 Discourse 账户下发布内容的 User-API 密钥,那么这种技巧显然是不可接受的。