java - 在混淆代码中隐藏字符串

标签 java android proguard

我只是使用 proguard 对我的 Android 代码进行了混淆,然后对其进行了反编译。有许多字符串我真的很想隐藏以免被窥探。当我反编译我的代码时,每个人都可以看到字符串......并进行更改。其中一个字符串是我的许可服务器的 URL,它们实际上可以将 url 更改为指向假服务器(因为我将向公众发布服务器代码)。隐藏此类信息的最佳方法是什么?

另外,我注意到 R 类字符串都是随机数,但我在反编译代码中找不到 R 类。它在哪里?

敌人示例 我看到了:new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);

2130903058 是一个布局文件,但它引用的是什么?这个数字没有任何意义,除非它指向某种地址。

最佳答案

假设您对模糊而不是安全感到满意,您可以使用许多机制,但像 proguard 这样的混淆器将无法为您提供帮助。

要实现这一点,您需要自己对字符串进行编码或加密,您使用的方法取决于您要防御的内容,如果您只是想隐藏明显的检查,那么编码可能就足够了(参见 android.util.Base64,http://developer.android.com/reference/android/util/Base64.html)。请注意,编码是不安全的,它所要做的就是删除对您网站的明显引用。

如果你想防御更多的东西,那么你可以开始对字符串进行实际加密,为此你可以通过 javax.crypto.Cipher 使用像 AES 这样的对称密码,http://www.androidsnippets.org/snippets/39/index.html提供了一个不错的使用示例。同样,这对黑客来说更烦人,然后更安全,因为您需要将 key 存储在 jar 中的某个位置,从而否定任何加密安全性。

为了更清楚地说明这一点,基本步骤是:

  1. 使用已知 key 手动创建加密字符串。
  2. 将您的代码转换为使用此字符串的解密版本,例如:

之前:

public class Foo {
    private String mySecret = "http://example.com";

    ...
}

变成:

public class Foo {
    private String encrypted = "<manually created encrypted string>";
    private String key = "<key used for encryption";
    private String mySecret = MyDecryptUtil.decrypt(encrypted, key);

    ...
}

所有这些的(好的)替代方案是考虑使用第三方 drm 解决方案,例如 google 提供的许可服务器 http://android-developers.blogspot.com/2010/07/licensing-service-for-android.html .这可能比你自己滚动的东西更安全,但受到与我上面描述的非常相似的限制。

关于java - 在混淆代码中隐藏字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4427238/

相关文章:

java - Fragment Intermediate(I) :Getting input from edittext, 在 fragment 的 TextView 中设置文本

java - 从 Arraylist 中获取 float 而不是对象

java - recyclerview 中的多个倒计时器

java - 提取特定单词后由分隔符分隔的值

java - 属性 'driverClassName' 抛出异常;无法加载 JDBC 驱动程序类 [org.postgresql.Driver]

android - Fragment 中带有自定义适配器的 ListView

android - Android App停止播放YouTube视频

java - 反编译混淆的java字节码

Android ProGuard 使用 gradle 插件 3.0.1(4.1?)构建签名的 apk 失败

Android Studio & ProGuard : cannot resolve symbol getDefaultProguardFile?