如何使用 Firebase 托管安全地存储和检索 android 应用程序(以本机 Java 编写)的 API 密钥?

How can I securely store and retrieve API Keys for an android application (written in native Java) using Firebase Hosting?

我刚开始学习编码。提供示例代码会很棒。

我使用 Firebase 开发了一个简单的 android 应用程序(原生 Java)。我有几个 API 键硬编码到我的应用程序的资源中。我读到最好将这些密钥存储在服务器上。我目前没有自己的域或服务器,但我有兴趣使用 Firebase 托管来存储这些 API 密钥。

如果能帮助我建立通过 Firebase 托管存储和检索这些 API 密钥的基础,我将不胜感激。如果其他建议既简单又安全,我愿意接受。

谢谢!

您的(移动或网络)客户端永远不应包含您的 Firebase 的 Secret。在某些时候,有人会对您的代码进行逆向工程,提取 Secret 并利用这些能够 read/write 您的 Firebase 数据库中的所有数据。在那个阶段你唯一能做的就是撤销秘密,这将使所有客户端失败。

Firebase 托管允许您仅存储静态资源。因此,虽然您可以将 API 密钥存储在 Firebase 的托管服务器上,但这对安全性没有多大帮助。每个人仍然可以阅读它。

您应该做的是在您的客户端中使用常规的 Firebase 身份验证。 Firebase's guide for user authentication on Android. A good example of this can be found in the Firebase Login Demo for Android.

中对此进行了介绍

您可以加​​密您的 API 密钥和其他敏感数据。 Here is a great article regarding that. The most sensitive thing is a password which will be used for a symmetric key generation. And it is important (yeah, the same issue again) to have not this password hardcoded in the code, but to calculate it in runtime. One of the good parts for its calculation is an APK's certificates data (Retrieve the apk signature at runtime for Android)。这可能会使逆向工程的工作变得更加困难。但是动态分析会帮助him/her得到一个秘钥。

服务器端计算技术在这里也很有用,尤其是结合前面的建议。

因此,密钥的一部分是在运行时生成的,另一部分是在用户身份验证成功后从服务器接收的。只是一个例子。

但最简单的方法是使用支持 string/dex-bytecode 加密的商业混淆器,例如 DexProtector

N.B。我隶属于 Licel(DexProtector 的开发者)