android - 如何保护谷歌 API 密钥
问题描述
我一直在对 Android 应用程序进行一些安全测试。我想要解决的一件事是 API 密钥安全性。特别是谷歌地方和地图键。有很多帖子讨论了这些选项,即将密钥编译为源代码,将它们放入资源文件中,将它们编译到共享库中等。在我的特定情况下,Maps 密钥在清单文件中,而 Places 密钥在共享库中。我创建了一个签名的 APK 来测试获取和使用其中一个密钥的难度。我做了以下事情:
- 使用 apktool 对 APK 进行逆向工程,
- 打开清单并抓住地图键,
- 创建了一个虚假版本的应用程序,其包结构与原始版本相同,包含一个带有谷歌地图片段的活动,
- 将 Maps 密钥放入虚假清单中,
- 运行显示地图的应用程序
然后我:
- 在假应用程序中创建了一个新类,其包和名称与原始应用程序相同,代码从 /data/data/[包名] 加载共享库,
- 将反向工程 APK 中的共享库复制到假应用的 /data/data/[package name] 文件夹中,
- 运行假应用程序,然后打印出 Locations API 密钥
所以最后,不费吹灰之力,我就有了两个密钥,然后我可以在应用程序的假版本中使用它们。
我确定我一定错过了什么。看起来 Maps 的唯一选择是将密钥存储在清单中。是什么阻止某人做我所做的事?当然不能只是冷漠。我意识到如果有人试图使用被劫持的 API 密钥发布他们的应用程序,他们可能会被抓住。但是,有人可以创建一个应用程序并让人们侧加载它。如果公司每次有人弄乱它时都必须更改被劫持的密钥,这对客户来说将是一个巨大的破坏。
解决方案
我相信您需要再次浏览 Google API 密钥的文档。似乎有一些称为限制的东西应该能够帮助您确保您的密钥受到保护并且不用于其他应用程序。
我相信限制会阻止来自您未包含的其他域的请求无法呈现。
推荐阅读
- c++ - 为什么可以使用指针创建新结构,但不能以相同的方式创建双精度结构?
- java - 导入 Maven 项目后出现 TestNG 错误
- java - Tomcat 不提供简单的 HTML 页面 (HTTP 404)
- spring-boot - 使用 Spring-Config Cloud Server 在自定义文件夹中加载多个基于 Profile 的属性
- r - 在 .rmd 文件中编译 TeX 的错误以创建 .html
- xamarin - Xmrain 表单应用程序部署失败
- java - 如何修复 ORA-01008:并非所有变量都绑定
- android - 'ng2-pdf-viewer' 不适用于带有 Ionic 3 的 iOS 中的本地 pdf
- bash - M4:如何从脚本中删除前导空格,然后是文件?
- javascript - 如何从我作为道具提供的反应组件的属性中评估图像的来源?