如何在 Firebase(客户端)中加密文件存储?

Posted

技术标签:

【中文标题】如何在 Firebase(客户端)中加密文件存储?【英文标题】:How to encrypt file storage in Firebase (client-side)? 【发布时间】:2021-10-07 12:27:09 【问题描述】:

我正在构建一个 Electron 应用并实施云存储支持。用户可以将我的应用程序中的文件上传到他们的帐户。作为管理员,我不想通过 Firebase 管理控制台读取文件。我还想避免使用用户密码,因为人们可能会忘记它。只需登录他们的帐户即可访问他们的文件。

在我的原型中,我将用户文件存储在data/$user.uid/。但是现在我卡住了,不知道应该使用哪个密码来加密文件。

围绕这个主题有几个问题涉及DigitalOcean,这对于我正在做的事情来说似乎太过分了。还有什么我可以用作用户对象的一部分的密码,并且不会在其他任何地方公开吗?

【问题讨论】:

【参考方案1】:

我在 Firebase 的文件存储中遇到了多个客户端加密选项。加密本身很简单,可以使用对称密钥(一种既可以加密数据又可以解密加密数据的密钥)与现有库一起执行。正如通常的问题一样,我们现在需要找到一个安全的地方来存储这个全能的密钥。

选项 1:在用户设备上存储密钥

优点:这会将密钥存储在用户的设备上,因此密钥永远不会在应用程序服务器中。 缺点:其他设备无法访问密钥以及数据。根据用例和情况,这不是一个糟糕的解决方案。

选项 2:Google Key Management Service for Encryption

优点:使用存储在 Google 密钥管理服务中的另一个数据密钥对密钥进行加密。用户的密钥对数据进行加密,然后通过 KMS 密钥对密钥进行加密并存储在数据库中。正如 Andy 在他的 blog 中正确指出的那样,KMS 密钥与 Firebase 数据库属于不同的 Google 帐户,因此没有任何用户有权读取数据和解密数据。黑客需要破坏两个帐户才能访问未加密的数据。 缺点:用户必须管理两个帐户。

选项 3:Stash the Key in User’s Google Account

优点:当用户登录时,我们会从用户的 Google 帐户获取 OAuth 凭据以请求用户的个人加密密钥,或者如果我们找不到,则创建一个。这样,密钥始终完全掌握在用户手中,但他们不必直接处理它。 Google Drive 提供了一个 API 用于创建特殊的应用程序数据文件夹(在 OAuth 期间需要用户同意)。此文件夹的内容对用户不可见,只能通过应用程序的凭据访问。 缺点:用户必须小心不要意外删除自己的加密密钥。

选项 4:Asymmetric Key Pair

优点:用户首先获得收件人的公钥。然后,他为自己生成一个对称密钥,用它对文件进行编码。然后,他为每个接收者创建此对称密钥的副本,并使用各自的公钥对其进行加密。最后,他将对称密钥的加密副本与加密文件一起传输到服务器并存储在那里。如果另一个用户想要下载文件,他会以加密形式获取它以及对称密钥的副本,即为他加密。他可以使用他的私钥解密后者,并且现在拥有可以用来解码文件的对称密钥。

选项 5:Public and Private Key Encryption

优点:在您注册用户时为他们创建私钥和公钥。使用用户 2 的公钥加密用户 1 设备上的数据。将加密数据存储在您的数据库中。当用户 2 读取加密数据时,他/她的私钥将能够解密它。

【讨论】:

这是一个绝妙的答案!非常感谢您的见解!就个人而言,我更愿意避免要求用户在某处存储密钥。它经常丢失,丢失数据是不值得的。选项 3 似乎是最有趣的选项,但我不确定如果通过 Twitter 或 Facebook 登录是否仍然有效 我刚想到的东西。我想知道是否适合散列用户 uid 并将其用作服务器上的目录名称。这意味着,由于我从未见过原始的 uid,我的应用程序可以使用它作为密码。 看起来很有趣。你成功了吗? 不幸的是还没有。我将在接下来的 2-3 个月内推出我的申请。我设置了一个提醒,如果这个选项是我选择的选项(或者不是以及为什么),我会就这个主题更新你

以上是关于如何在 Firebase(客户端)中加密文件存储?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用firebase函数返回保存在firebase存储中的文件的json内容

如何在不使用 Firebase 身份验证的情况下保护 Firebase 存储? (下一个)

是否有必要在将聊天消息存储到 Firebase 之前对其进行加密?

如何保护将 Firebase 存储用于以下应用程序的网站?

如何在移动应用程序中进行客户端加密时以安全的方式存储我的加密密钥?

如何在 Firebase 存储中恢复文件下载?