【问题标题】:How to implement Firestore data encryption?如何实现 Firestore 数据加密?
【发布时间】:2020-11-15 18:11:14
【问题描述】:

我实际上有一个 ReactJs 中的 SPA + 一个 Flutter 中的移动应用程序 + 一个使用 SailsJs 开发的 REST API,在单独的服务器上运行。当我们使用有效信息(ID/密码)登录时,我使用由 API 发回的 Firebase 身份验证生成的安全会话 cookie 来管理用户身份验证。

现在,我想对 Firestore 数据库中的高度敏感数据(药物、治疗方法、患者)进行加密,这样当入侵发生时,或者通过对生产数据库控制台的基本管理员访问权限,任何人都无法清楚地看到这些数据。

  1. 考虑到客户端和 API 服务器之间的连接是通过 HTTPS 进行的,我是否需要在客户端级别加密数据?或者我可以在将接收到的正文存储在 Firestore 之前在 api 级别加密并在 GET 端点解密加密数据?

  2. 我的想法是在用户注册时使用 AES 生成加密密钥,并将其存储在欧洲/法国托管公司的另一个数据库中,以避免美国云法案或其他任何风险(来自 Firebase 身份验证的用户 ID 加密密钥)。这是个好主意吗?我可以选择哪些其他解决方案来安全地存储和使用用户的加密密钥?

感谢您的帮助。

【问题讨论】:

    标签: firebase encryption google-cloud-firestore


    【解决方案1】:

    考虑到客户端和 API 服务器之间的连接是通过 HTTPS 进行的,我是否需要在客户端级别加密数据?或者我可以在将接收到的正文存储在 Firestore 之前在 api 级别加密并在 GET 端点解密加密数据?

    如果您在自定义 API 中加密/解密数据,则该 API 需要有权访问加密密钥。虽然可能性很小,但确实意味着可以从这里获取密钥,然后用于破坏数据。

    如果您在客户端代码中加密/解密数据,则只有该代码需要访问这些密钥。如果您随后通过某种带外机制交换密钥,这种机制不会一路存储在您的服务器上,那么任何有权访问这些服务器的人都无法解密数据。

    【讨论】:

    • 谢谢,那么你觉得我的 #2 怎么样?如果我选择您的解决方案,那么将在客户端(对于 ReactJs)的我的商店操作中请求密钥。如果一个人可以访问客户端服务器而不是 API,这有什么区别?无论如何,我们需要 Firebase 会话 cookie 来获取密钥,那么问题出在哪里?
    • 您似乎建议将密钥存储在另一个数据库中,这就是我在回答中提到的“越界机制”。通过将它们存储在另一个云数据库中,当该云数据库被黑客入侵时,您很容易受到攻击。为了更严格的安全性,密钥只能永久存储在客户端上。
    • 好的,但我需要允许用户通过多个设备使用该解决方案。如果我不将令牌存储在任何我不明白如何实现此目标的地方......我的基本想法是在登录时使用 Firebase auth cookie 请求令牌并将其存储在另一个 cookie 中以便重复使用,因为会话是活跃。
    • 您实际上是通过一种替代机制将密​​钥从一个设备发送到另一个设备。那是带外的(对不起,我反复打错了)意味着:您通过与数据所采用的机制不同的机制分发密钥,因此恶意用户不会自动获得使用数据所需的一切您的机制受到损害。
    • 那么解决方案是在没有 API 的情况下在客户端级别分发密钥?但这并不能解决我将密钥存储在某个地方的问题,如果我需要允许我的用户在使用相同帐户的任何设备上获取此令牌。修改后的解决方案是: 1- 在注册时创建一个新令牌并将其与用户 ID 一起存储在数据库 2 中。 2- 使用 API 登录路由返回的 Firebase 身份验证 cookie 在客户端登录时请求令牌。 3- 将该令牌存储在另一个 cookie 中以用于进一步的请求。 4- 在注销时将该 cookie 清除为 Firebase 。
    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2021-09-16
    • 2019-04-15
    • 2020-10-18
    • 2020-04-20
    • 2019-09-01
    相关资源
    最近更新 更多