Обфускация: скрыть жестко закодированные значения в java - программирование
Подтвердить что ты не робот

Обфускация: скрыть жестко закодированные значения в java

Возможный дубликат:
скрытые строки в 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});

И последние два параметра кажутся "темнее", чем опция raw, но я думаю, что для этого есть лучшие способы.

Как я могу улучшить это? Спасибо

4b9b3361

Ответ 1

Во-первых, вы не должны просто писать

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

Это мертвая отдача, что массив char на самом деле является строкой.

Вы можете сделать комбинацию следующих действий:

  • поместите свою "String" в массив int []
  • или даже лучше, разделите строку на несколько массивов int
  • вычислять/манипулировать значениями массива на разных этапах приложения, поэтому его значение станет действительным только на определенном интервале во время выполнения, гарантируя, что он не будет расшифрован любопытным взглядом, декомпилировав ваш код
  • передает массив назад и вперед, через локальные переменные, обратно в переменные экземпляра и т.д., прежде чем, наконец, преобразовать массивы в один массив, который будет передан конструктору String
  • сразу же устанавливает значение String равным null после использования, просто чтобы уменьшить время, в течение которого фактическая строка существует во время выполнения

Ответ 2

Я бы предпочел установить значение в статическом (класс) инициализаторе, используя алгоритм дешифрования Что-то вроде

class ...
  String CONCAT;

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

где uncrypt может быть действительно хорошим алгоритмом шифрования или несколько слабее декодирования base64.

В любом случае вам нужна простая программа для кодирования первой строки.