我只是使用 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 中的某个位置,从而否定任何加密安全性。
为了更清楚地说明这一点,基本步骤是:
- 使用已知 key 手动创建加密字符串。
- 将您的代码转换为使用此字符串的解密版本,例如:
之前:
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/