混淆:隐藏java中的硬编码值[重复]
Posted
技术标签:
【中文标题】混淆:隐藏java中的硬编码值[重复]【英文标题】:Obfuscation: hide hardcoded values in java [duplicate] 【发布时间】:2012-10-17 14:13:36 【问题描述】:可能重复:hiding strings in Obfuscated code
我试图隐藏我的应用程序的一些静态字符串,以使其更难反编译,这样就像密码算法名称这样的常量更难在混淆代码中找到。
我考虑过类似的事情:
String CONCAT= "concat"+"string";
String RAW_STRING= "raw_string";
String FROM_BYTES=new String("from_bytes".getBytes());
String FROM_CHARS=new String(new char[]'f','r','o','m','_','c','h','a','r','s');
String FROM_CHAR2=new String(new char[]102,114,111,109,95,99,104,97,114,115,95,50);
最后两个选项似乎比原始选项“更暗”,但我想有更好的方法可以做到这一点。
我该如何改进呢?谢谢
【问题讨论】:
我从来没有为 android 编程过,但是我看不出问题的重点。如果用户不知道如何反编译,只能通过记事本阅读代码,你只是放了一些没用的算法名,他/他不知道真正涉及的是哪一个。如果她/他知道如何反编译,那么没有任何混淆可以阻止他/他用 System. out.println. 我正在使用简单的 gradle 函数隐藏这种字符串。它只保护肉眼,但无论如何,总比没有好:gist.github.com/shomeser/68f4fe360be0edac95e4 【参考方案1】:首先,你不应该只写
String FROM_CHAR2=new String(new char[]102,114,111,109,95,99,104,97,114,115,95,50);
char 数组实际上是一个字符串,这简直是天方夜谭。
你可以做以下的组合:
-
将“字符串”放入 int[] 数组中
甚至更好,将您的 String 分成几个 int 数组
在最终将数组转换为要传递给 String 构造函数的单个数组之前,来回传递数组,通过局部变量,传回实例变量等
使用后立即将String设置为null,只是为了减少实际String在运行时存在的时间
【讨论】:
#3 的任何模式或示例代码? #5 有什么帮助? #5 有帮助,因为如果有人可以反编译您的代码,这意味着他们也可以运行它,将调试器标志放在适当的位置等。因此,您还应该防止运行时检查。这意味着您的实际 String 存在的时间越少,就越安全。 对于#3,我自己还没有走到这一步,但你可以尝试this 或使用jzlib之类的东西将你的字符串“压缩”成字节数组,并在需要时解压缩它们。不要使用 Android 的 zip 库,因为它的方法名称不能混淆,使整个企业非常明显。 澄清一下,我使用 JZLib 压缩单个字符串,它确实有效,但它是为了减少数据大小而不是为了混淆。 不过,当我用 System.out.println 替换密码实例化 std 库调用时,我不明白这如何工作。【参考方案2】:我更喜欢使用解密算法在静态(类)初始化程序中设置值 类似的东西
class ...
String CONCAT;
static
CONCAT = uncrypt ("ahgsdhagcf");
其中 uncrypt 可能确实是一个很好的解密算法,或者是一个较弱的 base64 解码。
无论如何,您首先需要一个简单的程序来编码您的字符串。
【讨论】:
以上是关于混淆:隐藏java中的硬编码值[重复]的主要内容,如果未能解决你的问题,请参考以下文章