android - 在应用程序中存储和保护私有(private) API key 的最佳实践

标签 android reverse-engineering proguard api-key

大多数应用开发者会将一些第三方库集成到他们的应用中。如果是访问服务,例如 Dropbox 或 YouTube,或者记录崩溃。第三方图书馆和服务的数量是惊人的。大多数这些库和服务都是通过以某种方式与服务进行身份验证来集成的,大多数情况下,这是通过 API key 发生的。出于安全目的,服务通常会生成公共(public)和私有(private) key ,通常也称为 secret key 。不幸的是,为了连接到服务,必须使用此私钥进行身份验证,因此可能是应用程序的一部分。 不用说,这面临着巨大的安全问题。可以在几分钟内从 APK 中提取公共(public)和私有(private) API key ,并且可以轻松实现自动化。

假设我有类似的东西,我该如何保护 key :

public class DropboxService  {

    private final static String APP_KEY = "jk433g34hg3";
    private final static String APP_SECRET = "987dwdqwdqw90";
    private final static AccessType ACCESS_TYPE = AccessType.DROPBOX;

    // SOME MORE CODE HERE

}

您认为存储私钥的最佳和最安全的方式是什么?混淆、加密,你怎么看?

最佳答案

  1. 实际上,您编译的应用程序包含 key 字符串,还包含常量名称 APP_KEY 和 APP_SECRET。从这种自记录代码中提取 key 是很简单的,例如使用标准的 Android 工具 dx。

  2. 您可以应用 ProGuard。它将保持键字符串不变,但会删除常量名称。它还将尽可能用简短、无意义的名称重命名类和方法。然后提取 key 需要更多时间,以确定哪个字符串用于哪个目的。

    请注意,设置 ProGuard 并不像您担心的那么困难。首先,您只需要启用 ProGuard,如 project.properties 中所述。如果第三方库有任何问题,您可能需要在 proguard-project.txt 中隐藏一些警告和/或防止它们被混淆。例如:

    -dontwarn com.dropbox.**
    -keep class com.dropbox.** { *; }
    

    这是一种蛮力方法;一旦处理后的应用程序工作,您就可以优化此类配置。

  3. 您可以在代码中手动混淆字符串,例如使用 Base64 编码,或者最好使用更复杂的编码;甚至可能是 native 代码。然后,黑客将不得不对您的编码进行静态逆向工程或在适当的位置动态拦截解码。

  4. 您可以应用商业混淆器,例如 ProGuard 的专用兄弟 DexGuard .它还可以为您加密/混淆字符串和类。提取 key 需要更多的时间和专业知识。

  5. 您也许可以在自己的服务器上运行部分应用程序。如果你能把 key 放在那里,它们是安全的。

最后,您必须做出经济权衡: key 有多重要,您能负担多少时间或软件,对 key 感兴趣的黑客有多老练,需要多少时间他们想花多少钱, key 被黑客入侵之前的延迟有多少值(value),任何成功的黑客将分发 key 的规模等。像 key 这样的小信息比整个应用程序更难保护。从本质上讲,客户端没有什么是牢不可破的,但您当然可以提高标准。

(我是 ProGuard 和 DexGuard 的开发者)

关于android - 在应用程序中存储和保护私有(private) API key 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14570989/

相关文章:

python - 对 .pyd 文件进行逆向工程有多难?

android - 如何通过 Eclipse 使用 Proguard 混淆 apk?

java - Android ListView - onItemClickListener

javascript - 打开键盘android,隐藏内容phonegap

java - 如何锁定threadS写入线程读取的两个变量(Android)

android - AndroidEmoji-htc.ttf 文件中的表情符号图像是如何编码的?

c - 如何在 C 中实现移位运算的逆运算?

Android Proguard 没有内联

java - 无法构建 apk - android studio

android - 单击消息收件箱时是否可以进行身份​​验证