【问题标题】:Store API Key within Keystore在 Keystore 中存储 API 密钥
【发布时间】:2018-04-17 22:50:37
【问题描述】:

我继承了一个应用程序,该应用程序调用受 API 密钥保护的服务,不幸的是,该 API 密钥嵌入在应用程序中。显然,这并不理想,因此我希望将 API 密钥嵌入到 Android Keystore 中。我过去曾在其他 Android 应用程序上使用过诸如 https://github.com/scottyab/secure-preferences 之类的库,但在这种情况下,该安全性不会通过安全审核。

阅读:https://medium.com/@ericfu/securely-storing-secrets-in-an-android-application-501f030ae5a3 我得到了一切,但最初作为构建的一部分如何在密钥库中获取 API 密钥。理想情况下,我会将 API 密钥作为登录过程的一部分返回,以便在运行时插入,但不幸的是,我目前无法更改登录服务。

我已经阅读了许多帖子,例如:Best practice for storing and protecting private API keys in applications,但大多数帖子都专注于将您的密钥远离源代码存储库。

所以,问题是:是否有 gradle 构建机制(或任何机制)可以在构建时将特定的数据插入 Android Keystore?

【问题讨论】:

    标签: android android-keystore


    【解决方案1】:

    是否有 gradle 构建机制(或任何机制)可以在构建时将特定数据插入 Android Keystore?

    根据定义,这是不可能的。 AndroidKeyStore 在用户的 Android 设备上,而不是在开发人员机器上。在构建时,您的应用不在用户的 Android 设备上,并且无法对它们执行任何操作。

    【讨论】:

    • 我就是这么想的。因此,我可以安全地存储 API 密钥的唯一方法是将其包含在登录过程响应中,并在运行时将其存储在 AndroidKeyStore 中。总结一下吗?
    • @PerryHoekstra:或者,不要从您的应用程序调用这些 Web 服务,而是从您自己的服务器调用。这有多实用取决于 Web 服务的性质和您对它的使用。欢迎您使用 DexGuard 之类的产品来尝试让攻击者更难提取打包在您的 APK 中的 API 密钥,尽管“更困难”!=“不可能”。您的方法(登录响应中的 API 密钥)是否有效取决于该 API 密钥的使用方式。例如,如果 API 密钥必须在清单中,则您的方法不是一个选项。
    • 感谢您的建议,但我受到当前存在的服务(及其安全机制)的约束。我查看了我引用的 StackOver 问题中记录的混淆方法,但由于它不是完整的证据,我不知道它是否会通过组织的安全审计员。