如何在 Firebase 中加密用户数据
Posted
技术标签:
【中文标题】如何在 Firebase 中加密用户数据【英文标题】:How to encrypt user data in Firebase 【发布时间】:2016-11-13 05:48:44 【问题描述】:我正在使用 Firebase 的电子邮件/密码登录方法。我想在将用户保存到实时数据库中的数据发送到数据库之前对其进行加密。 Firebase 已经处理了用户密码,但是我可以以某种方式使用它来加密只有客户端无法解密的数据吗?如果能用客户端sdk实现就好了。
所以我的流程是这样的:
-
用户使用其凭据登录(由 firebase 自己处理)
用户使用某个唯一密钥加密某些数据,该密钥只能从凭据生成,也可以从仅对用户可用的某些数据生成,而不是我。 (此密钥需要在会话之间或用户更改密码后保持不变。)
数据被保存到数据库中(我无法读取它,因为它使用用户凭据加密)
用户在不同的设备上登录(可以立即生成解密密钥并可以解密数据。)
【问题讨论】:
您需要将解密密钥存储在某处。如果它在数据库中,您可以使用它。如果它位于客户端设备中,则无法将其迁移到其他设备。除非用户在记住或传输此密钥方面有一些作用,否则我看不出在不涉及用户的情况下如何做到这一点 这是一个基本要求,我想知道其他人是如何解决这个问题的。 security.stackexchange.com 可能对您的问题有答案。也许这个问题security.stackexchange.com/questions/91704/… 如果你加密了数据库,你不能对它做任何搜索查询 如果有帮助,我写了一篇关于我如何解决这个问题的博客文章:geero.net/2017/05/… 【参考方案1】:您可以通过以下方式轻松做到这一点:
-
在用户 A 登录后,他的手机上会生成一个随机的公钥私钥对。例如:使用 Ecc Curve25519
A 的私钥安全地存储在他的手机上
A 的公钥存储在 firebase 中,任何与 A 聊天的人都可以访问。
如果 X 向 A 发送消息,他从 Firebase 获取 A 的公钥,在本地为 A 加密消息,并将加密的消息存储在来自 A 的收件箱中的 firebase 上
A 从 firebase 下载加密消息,并使用存储在手机上的私钥对其进行解密
(A 到 X 反之亦然)
如果 A 想要移动到另一部手机或想要使用多部手机,您可以这样做:
-
要求 A 定义一个强密码来加密他本地存储的私钥。 (或创建一个随机密码并使用二维码进行密钥交换)
使用步骤 1 中的密码在他的手机上本地加密私钥(例如:使用 AES256)并将其上传到 firebase。 (可选用他的私钥签名)
从 A 的第二个设备下载加密的私钥
在第二台设备上向 A 请求密码并安全地存储私钥(可选用 A 的公钥检查签名)
如果不需要备份,请从 Firebase 中删除加密的私钥
【讨论】:
标准 #4 是用户可以使用其他手机登录并能够访问她的数据。所以这不起作用。但是,如果在密钥生成中使用了用户密码或其他用户提供的秘密,它可能会起作用。当您使用新手机时,用户需要重新添加他们的密码才能解锁他们的数据。 答案第二部分有描述 啊,是的。的确是。对不起,我错过了。 @Hollerweger 嗨,我是加密新手,我不确定我是否正确理解了这个系统。如果攻击者可以访问数据库,他将拥有所有用户的公钥,就像在第 3 步中一样,我们将它们保存在 Firebase 中,并且能够解密整个数据库,对吗?使用建议的模式,攻击者可以使用公钥来解密收件箱。其余的数据库等等。我错过了什么吗?如果我是正确的,这只会减慢应用程序的速度并给用户带来无法检索自己数据的风险,对吧?你能澄清一下吗?非常感谢。干杯。 不可以,公钥只能用于加密,不能用于解密。用于解密的私钥未存储在 Firebase 中,以上是关于如何在 Firebase 中加密用户数据的主要内容,如果未能解决你的问题,请参考以下文章
如何限制用户在 Firebase 实时数据库中上传一定数量的数据
如何使用 Firebase 9 电子邮件和密码创建用户并将该用户的其他数据保存在 firebase db 集合中?
如何检查 Firebase 数据库中用户输入数据的唯一性?迅速