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

标签 android reverse-engineering proguard api-key

<分区>

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

假设我有类似的东西,我该如何保护 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/27431236/

相关文章:

Android - 将按钮放在 ImageView 上的确切位置

c - 为什么我们需要取消映射才能使PE文件有效?

linux - Hexdump 反向命令

java - Proguard 删除 com.sun.mail.imap.IMAPProvider

android - OnItemLongClickListener 在自定义 ListView 中不起作用

android - android模拟器如何在eclipse中联系主机开发机器?

android - Android 应用程序的测试版本和 proguarded 版本 - NoSuchMethodError

android - 使用 MobileFirst 8.0 IF201804051553 进行 android 发布构建时出现 Proguard 警告

Android Firebase 数据在刷新之前不会加载

c# - 逆向工程dll并直接重新上传到服务器