模糊处理:在 java 中隐藏硬编码的值

2022-09-02 22:22:10

可能的重复:
隐藏模糊代码中的字符串

我试图隐藏一些我的应用程序的静态字符串,以使其更难反编译,这样就像密码算法名称等常量更难在混淆代码中找到一样。

我考虑过这样的事情:

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});

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

我该如何改进?谢谢


答案 1

首先,你不应该只是写

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

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

您可以执行以下各项的组合:

  1. 将“字符串”放入 int[] 数组中
  2. 或者更好的是,将字符串分解为几个int数组
  3. 在应用程序的不同阶段计算/操作数组的值,因此其值仅在运行时的特定时间间隔内才有效,从而保证它不会通过反编译代码而一目了然地破译。
  4. 通过局部变量、回实例变量等来回传递数组,最后将数组转换为要传递给 String 构造函数的单个数组
  5. 使用后立即将字符串设置为 null,只是为了减少实际字符串在运行时存在的时间

答案 2

我更喜欢使用解密算法在静态(类)初始值设定项中设置值 类似

class ...
  String CONCAT;

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

其中,uncrypt可能真的是一个很好的unencrypt算法,或者稍微弱一些base64解码。

无论如何,您需要一个简单的程序来首先对字符串进行编码。