Обфускация: скрыть жестко закодированные значения в 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, но я думаю, что для этого есть лучшие способы.
Как я могу улучшить это? Спасибо
Ответы
Ответ 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.
В любом случае вам нужна простая программа для кодирования первой строки.