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

Posted

技术标签:

【中文标题】是否有必要在将聊天消息存储到 Firebase 之前对其进行加密?【英文标题】:Is it necessary to encrypt chat messages before storing it into firebase? 【发布时间】:2018-05-30 09:58:56 【问题描述】:

据我所知,Firebase 通过 HTTPS 连接发送数据,因此数据已经被加密。虽然 Firebase 提供了安全规则来保护我的数据结构,但我仍然可以看到数据库中的字符串消息。

我只是好奇在将数据推送到 Firebase 之前加密消息是否是个好主意。 我应该从这个话题转到别的话题吗?

谢谢。

【问题讨论】:

感谢@JeffMinsungKim 提出的问题...您让我搜索相同问题变得更加容易。 @Phillip Jacobs 没问题,伙计。我是一个感谢你的好话的人。 :) 【参考方案1】:

您似乎很了解 Firebase 数据库的工作原理:data is encrypted in transit,它是 stored on encrypted disks on the servers。如果您在设备上启用本地持久性,on device data is not encrypted.

但应用的管理员可以在 Firebase 控制台中查看数据。如果您的应用要求管理员无法读取此数据,那么您需要先在客户端对其进行加密,然后再将其发送到 Firebase。不久前,一位开发人员解释了他们的end-to-end encrypted chat on the firebase-talk mailing list。

【讨论】:

非常感谢您的深入回答,弗兰克。它帮助我一次理解了很多东西。 很高兴听到杰夫。我期待看到您的端到端加密解决方案(以及该领域未来问题的答案)!【参考方案2】:

Hey Jeff:您是对的,当您将一些数据写入 Firebase/Firestore 时,数据:

    使用 HTTPS 通过网络进行保护。 然后,当它登陆 Firebase REST 前端服务器时,HTTPS 终止并且服务器可以访问完整的负载 然后 REST 服务器将数据路由到后端/数据库,后者也可以访问数据。 当数据写入磁盘时,它是静态加密的,但静态加密密钥也可供 Google 使用,您的管理员也将看到 Firestore 内容

加密数据客户端(端到端加密)禁止所有这些参与者/角色看到您的数据。

在客户端加密数据相当简单(跨移动平台和浏览器的兼容性很棘手)。另一个棘手的部分是密钥管理,以使一个用户能够访问解密密钥,而其他用户不会在不安全的通道中发送密钥。

你可以实现的方式是:

    在您注册用户时为他们创建私钥和公钥 使用用户 2 的公钥加密用户 1 设备上的数据 将加密数据写入 Firestore 当用户 2 读取加密数据时,她的私钥将能够解密它。

在 GitHub 上查看适用于 ios 的 Firebase E2EE 聊天示例:https://github.com/VirgilSecurity/demo-firebase-ios 和 android:https://github.com/VirgilSecurity/demo-firebase-android

HTH, 大卫

【讨论】:

哇...非常好的答案 按照你的步骤我认为问题是你在哪里存储用户注册时的私钥和公钥?在数据库中还是在本地设备上? 我的想法是将每个用户的公钥存储在 Firestore 中,并使用 flutter_secure_storage 或 biometric_storage 将他们的私钥本地存储在他们的设备上。

以上是关于是否有必要在将聊天消息存储到 Firebase 之前对其进行加密?的主要内容,如果未能解决你的问题,请参考以下文章

firebase 存储 - 使用 android 相机上传照片,但在将照片提交到 firebase 存储时崩溃

使用 firebase 按最新消息对聊天列表进行排序

Firebase 网络应用聊天重复聊天输入

如何在将图像上传到 Firebase 存储之前对其进行压缩?

输入聊天消息时的Firebase警告[重复]

如何在将照片上传到 Firebase 存储时将日期或时间等用户图像详细信息添加到文件名?