混淆:隐藏java中的硬编码值

时间:2012-10-27 15:56:26

标签: java android security proguard

  

可能重复:
  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});

最后两个选项似乎比原始选项“更暗”,但我想有更好的方法可以做到这一点。

我该如何改进?谢谢

2 个答案:

答案 0 :(得分:9)

首先,你不应该只写

String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50});

char数组实际上是一个String,这是一个死的赠品。

您可以执行以下操作:

  1. 将您的“String”放在int []数组
  2. 甚至更好,将你的String分成几个int数组
  3. 在应用程序的各个阶段计算/操作数组的值,因此它的值只会在运行时的某个时间间隔内变为有效,从而保证通过反编译代码不会在奇怪的情况下解密它
  4. 在最终将数组转换为单个数组以传递给String构造函数之前,来回传递数组,通过局部变量,返回实例变量等,
  5. 在使用后立即将String设置为null,只是为了减少实际String在运行时存在的时间

答案 1 :(得分:2)

我更喜欢使用解密算法在静态(类)初始化程序中设置值 像

这样的东西
class ...
  String CONCAT;

  static {
     CONCAT = uncrypt ("ahgsdhagcf");
  } 

其中 uncrypt 可能真的是一个很好的解密算法或者基本64解码稍微弱一些。

在任何情况下,您都需要一个简单的程序来首先对字符串进行编码。