混淆:隐藏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中的硬编码值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

更改 javascript 文件中的硬编码 ID

用于测试的硬编码SSRS多值参数

如何修改代码中的硬编码问题

删除 C# 中重复的硬编码循环和条件

rpi-rf_send 脚本 + python raspberry pi 中的硬编码射频代码

在 oracle 中列出的硬编码项目