谷歌服务的json文件安全吗?

39
如果一个黑客反编译我的 APK,他能否从这个文件中看到我的 API 密钥?我不担心我的源代码存储库。我只是担心黑客能以某种方式从我的 APK 中看到这个 API 密钥。我试图在运行时加密此文件并解密它,但遇到了一些问题。

3
从应用程序中获取任何内容是非常容易的,毕竟您正在将所有代码(以APK形式)交给一个未知的人。他们可以随时反编译代码,了解其工作原理,创建一些脚本来模仿API调用并使其正常工作。您只需稍微延迟一下就可以了。更好的问题是关于加密和解密的问题,由于Firebase依赖项自动使用google-services.json文件,所以您需要进行一些修改。 - zeekhuge
2
作为客户端,你的API实际上将在你的APK中可见。如果这是一个明智的价值,这可能会成为一个问题,因为APK只是一个ZIP文件。你应该只保留公钥。我知道的唯一解决方案是在首次启动应用程序时实现安装例程,以便在那时从您的服务器动态加载密钥。编辑客户端加密更糟糕,因为您将暴露您的加密方法。 - Kaddath
6
黑客从拥有你的 API 密钥中可以获得什么好处?需要注意的是,一些非常知名的应用程序(例如 Telegram)也在应用程序中硬编码了易于发现的 API 密钥。 - President James K. Polk
3
因为理论上黑客可以通过访问这些密钥来发布firebase事件,所以它被视为安全风险。如果他们也能从我们的系统中提取这些密钥会怎样呢?这些Firebase事件可能包含敏感数据,因此,如果APK被反编译,我们不希望在google-services.json中公开此密钥。 - stepheaw
2
关于我的评论的旁注:当然,如果您在安装时要求密钥,您必须验证请求密钥的人是否确实来自您的应用程序,这是一个有点递归的问题,因为要添加一个用于请求密钥的密钥,您知道我的意思!我不知道有什么适当的解决方案,也不知道为什么他们使用基本ZIP..无论如何,欢迎那些知道互联网上没有真正安全性的人..所有的安全都是混淆和机器计算素数的结果;O - Kaddath
显示剩余4条评论
4个回答

37
Google插件的设置方式使得很难隐藏google-services.json文件的内容。唯一可行的方式是重新实现插件已经为您完成的工作,但我不建议这样做。如果按照Google的意图使用该插件,不幸的是,任何解压您的APK的人都可以轻松获取您的Firebase/Google API密钥。
然而,您可以通过配置谁可以使用API密钥来防止滥用。对于Android应用程序,您可以指定您的API密钥只能由签署给定密钥库并使用给定包名称的Android应用程序使用。
要配置这些限制,请按照此处的文档操作:https://cloud.google.com/docs/authentication/api-keys#api_key_restrictions 除了限制API密钥之外,如果您使用Firebase RTD/Firestore,还应确保在数据存储中配置安全规则。根据您的用例,您可以防止匿名用户读取或写入数据库的某些部分。
如果您想了解更多详细信息,这里有一篇关于如何在Android应用程序中保护API密钥的好文章:https://proandroiddev.com/developing-secure-android-apps-8edad978d8ba

3
Firebase安全规则是保障安全的方式。如果有人想要试图以任何方式利用我的API密钥,那没关系,因为设置了安全规则可以防止读写权限。 - stepheaw
@stepheaw,你能给出一个针对Firestore和实时数据库的Firebase安全规则的例子来解决这个问题吗?谢谢。 - Bitwise DEVS

11
根据Firebase文档此处所述:

当您将应用连接到Firebase项目时,Firebase控制台会提供一个Firebase配置文件(Android/iOS)或配置对象(Web),您可以直接将其添加到本地项目中。

  • 对于iOS,您需要添加GoogleService-Info.plist配置文件

  • 对于Android,您需要添加google-services.json配置文件

Firebase配置文件或配置对象将您的应用与Firebase项目及其资源(数据库、存储桶等)关联起来。

然后它将内容标识为公共内容:

该内容被视为公共内容,包括特定于您的平台的ID(在Firebase控制台设置工作流程中输入)以及特定于您的Firebase项目的值,例如API密钥、实时数据库URL和存储桶名称。

请记住,如果使用实时数据库、云Firestore或云存储,则仍需要遵循Firebase所描述的安全指南。 此外,请注意,即使这些文件对于您的应用程序是公开的,也不应将它们放在开源项目的公开存储库中。

6
我在添加了谷歌的信息:“该内容被视为公共内容”,因此对讨论做出了贡献。由于文件内容被视为公开内容,这回答了这个文件可以暴露的问题。 关于为什么它不应该放在公共存储库中,这是一个不同的问题。任何克隆你存储库的人都应该创建自己的文件来访问他们的Firebase帐户。因此,将这个文件添加到公共存储库中是没有用的,应该避免。 - fhsilva
除了上传代码到私有仓库外,我是否还能做些什么?我正在使用React Native开发iOS和Android应用。 - abhish
据我所知,将json文件包含在公共存储库中是可以的,真正保护它的方法是在Firebase控制台和Cloud控制台中设置SHAs,并在数据库的安全规则上付出一些努力。您还可以查看此答案:https://dev59.com/E1oU5IYBdhLWcg3wi3WW#72200821 - Bitwise DEVS

3

显然这样做并不安全,但你别无选择,因此重要的是限制你的许可证密钥。

解压你的apk(将其重命名为.zip并打开,或从bash中运行unzip [your apk path]

现在 - 最关键的一步:在.zip的根目录中找到一个名为resources.arsc的文件,并用任何同意打开它的编辑器打开它。即使是TextEdit或Atom也可以。搜索AIza,这里就有了。带有你的用户ID。

... 或者更简单的方法:只需将APK拖放到Android Studio中。你可以看到其中的所有内容:在resources.arsc中,你会找到所有的密钥和值,所有的字符串,所有的整数……所有这些都使用易于美观的图形用户界面(GUI)呈现。

更重要的问题是:是否有一种方法可以告诉ProGuard有效地混淆它。 或者是否有一种方法可以使用与服务器共享的秘密密钥对它进行加密。


1
有没有解决这个问题的方案? - DAC84
如果您不使用Cloud控制台限制JSON文件中的API密钥,则存在安全风险。 - Bitwise DEVS

3

这个应用程序中的所有东西都可以非常容易地阅读,因此像Google建议的那样,您必须避免将信息放在apk中,特别是Firebase / Google云消息传递或此类服务的服务器密钥。


5
我同意,但这对我来说有点困惑...我是否可以在google-services.json中隐藏密钥,并在运行时用其他值替换它们?还是该文件只在构建时使用? - stepheaw
@stepheaw 你有找到任何如何保护 google-services.json 密钥的更新吗? - Amit
1
我们的解决方案是一个构建时间例程,用于交换密钥。虽然我们的加密方法嵌入在应用程序中。因此,它并没有使其完全安全,只是增加了黑客需要通过的另一层。尽管如此,自那时以来,我已经参加了其他几个项目团队-他们对这些密钥不是那么关注。有些公司有非常严格的政策和安全审查,而经常审查这些事情的人对它们的用途并不理解,他们只知道它们不应该以明文形式存在。 - stepheaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接