使用 Google Cloud KMS 进行 Firebase 实时数据库加密的最佳实践 [关闭]

Posted

技术标签:

【中文标题】使用 Google Cloud KMS 进行 Firebase 实时数据库加密的最佳实践 [关闭]【英文标题】:Best practice for Firebase Realtime Database encryption using Google Cloud KMS [closed] 【发布时间】:2019-04-05 04:01:12 【问题描述】:

我们正在使用 Firebase 数据库规则来保护我们的数据库。我们还希望通过加密敏感的用户信息来增加额外的安全性。目前我们的加密方法是:

在用户将数据写入数据库之前使用公钥加密用户数据客户端 在通过 GET 请求将数据传递给用户之前使用服务器上的私钥解密

我们的私钥是在服务器代码中硬编码的字符串。我们希望使用 KMS 的加密/解密方法来保护私钥,并且只在代码中存储加密的私钥。

加密后的私钥会存储在服务器代码中,并在运行时使用 KMS 解密,这样开发人员就无法访问私钥。

但是,我们不确定是否有更好的方法使用 Cloud KMS。 KMS 可以同时用于客户端加密和服务器端解密吗?或者使用 KMS 增强数据库加密的最佳做法是什么?

【问题讨论】:

【参考方案1】:

您的问题很好地说明了为什么除非您知道自己在做什么,否则不应实施加密和数据安全。您的实施存在严重缺陷。询问是一个很好的开始,但要涵盖的内容很多。

通常,您不使用私钥/公钥对来加密数据。公钥加密用于安全地协商对称加密密钥。与对称加密相比,公钥加密的 CPU 时间也非常昂贵。

示例。如果您要在发送到客户端之前在服务器上解密数据,为什么还要在用户端加密数据?

在服务器代码中硬编码私钥是一种可怕的做法。这几乎可以保证您的密钥对会被泄露。

是的,使用 Cloud KMS 将为您带来巨大的进步。这将使安全性更容易实施,并消除一些加密管理难题。但是,您需要了解 KMS 和加密最佳实践。设计不良的安全性很容易被破解。设计不佳的安全性很容易导致数据无法访问。

简单来说,您至少需要以下内容:

    加密密钥管理 按键轮换 静态加密 传输中的加密 职责分离(管理员无法解密数据)

除非有很好的设计理由或合规性要求,否则您不应在客户端加密数据 - 客户端不应管理密钥。应使用加密的传输协议安全地传输数据。您的服务器应该控制和管理数据库的加密。数据库也应该加密静态数据。

我可以一直讲下去,这就是为什么有很多关于这个主题的书籍。

【讨论】:

【参考方案2】:

我认为你的计划听起来不错。是的,您可以通过使用 Cloud KMS 包装您的私钥来提高安全性;然后,您可以将打包后的密钥放入源代码或应用程序的配置文件中,然后在启动时解包以获取私钥。这将让您降低拥有可以解密开发人员处理的数据库的密钥的风险。

另一种方法是不使用本地加密:相反,您可以在每次写入或检索一行时调用 KMS 来加密和解密数据。这可能会给您带来一些好处(您的二进制文件甚至不知道密钥;作为 KMS 解决方案的一部分,您可以获得轮换等;并且您可以获得每个密钥使用的日志),但会产生一些成本(您现在对每个请求都依赖 KMS 服务;KMS 请求的延迟可能会降低性能;每次访问的请求比仅在启动时打开包装要花费更多的钱;并且您依靠通道加密来保护发送到您的用户数据服务,因为您现在要在服务端加密)。

KMS 现在还支持非对称加密 (docs here),因此您可以将两者结合起来:在客户端执行公钥加密,然后使用非对称 KMS 密钥对每个请求进行解密。优缺点与上述类似,不同之处在于您可以保持与当前相同的数据公开和客户端加密。

我同意另一个答案,即这里进行客户端加密的安全优势并不完全清楚,因为服务有权解密;目前尚不清楚让它进行加密是否会导致风险增加。但是按照您的描述使用公钥并不会明显增加风险(假设您做得很好且正确,这不是一件小事)。

感谢您提出问题并使用 Cloud KMS;如果您有任何其他问题可以帮助我们,请告诉我们!

【讨论】:

让我更好地解释我们的用例。用户使用 firebase write 将敏感数据写入数据库。我们不希望这些数据以未加密的形式存在于数据库中。这就是为什么我们在发送到数据库之前在客户端加密并在从 API 将其传递给用户之前解密。您能否帮助我们找到“将数据加密保存在数据库中”的最佳实践?是否完全没有必要在写入数据库之前加密客户端上的数据,因为到 Firebase 的传输已经加密? 我明白了。在客户端中加密当然很有用,因为您可以直接从客户端写入,而无需服务器端中介。所有传输中的数据都经过加密,所有 Google 静态数据都默认加密,但是如果您希望使用您的密钥加密静态数据,以某种方式使用 KMS 是个好主意。我认为您的公钥计划是一个合理的计划,但它确实需要您实施包装。

以上是关于使用 Google Cloud KMS 进行 Firebase 实时数据库加密的最佳实践 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

NoClassDefFoundError:com/google/cloud/kms/v1/KeyManagementServiceClient

Google Cloud KMS:无法解密

Google Cloud KMS App Engine 加密不起作用

我应该如何使用 Google Cloud KMS 存储由另一个应用程序生成的访问令牌?

您可以在具有服务角色的项目之间共享 Google Cloud KMS 密钥吗?

Google Cloud KMS 错误 - 您所在地区无法访问此 API。 (HTTP 状态 - 403)