Шифрование исполняемого фляги - PullRequest
0 голосов
/ 05 декабря 2018

Чтобы разобраться с основами, я использую Eclipse для кодирования и создания своих исполняемых jar-файлов.

Некоторые предварительные исследования:
Я знаю, что вы можете декомпилировать файлы JAR и увидеть исходный код.Фактически, существуют бесплатные программы, такие как JD GUI , которые могут легко декомпилировать файл jar и раскрыть все его содержимое.Это проблема, особенно если вы хотите распространять Java-программу.
Когда я узнал об этом, я сразу начал искать решение, но не смог найти прямой ответ.

Проблема:
Мой вопрос: как вы шифруете файл jar или, по крайней мере, шифруете файл класса, чтобы он не читался, если вы его декомпилируете?
Одно из решений, которое я продолжаю видеть, состоит в том, что вы можете запутать свой код, но проблема в том, что ваш код все еще должен быть в состоянии выполняться, и, следовательно, запутывание может быть реверс-разработано с небольшими усилиями.Единственное другое решение, о котором я мог подумать, - это наличие двух отдельных файлов jar, чтобы один из файлов jar был зашифрован и для его расшифровки требовался другой файл jar.Теперь, прежде чем сказать «они могли бы просто декомпилировать другую банку и использовать ее для расшифровки первой банки».Моя идея заключалась в использовании шифра, который будет использоваться для расшифровки первой банки.Теоретически, пользователь мог бы знать точный метод расшифровки, но без секретного слова (шифр) он был бы совершенно бесполезным.

Мой вопрос:
Как бы я это реализовал?Я спрашиваю, как запустить файл jar для шифрования / дешифрования другого jar с помощью указанного пользователем шифра?
Не стесняйтесь приводить пример кода, я ищу любую помощь, которую могу получить.

Заранее спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

Представьте, что у вас есть файл JAR, в котором некоторые классы были зашифрованы после компиляции.

Допустим, у вас есть зашифрованный класс с именем SecureMain, который вы хотите расшифровать и выполнить:

public class SecureMain implements Runnable {

    @Override
    public void run() {
        System.out.println("Running...");
    }

}

Учитывая следующую структуру файла JAR:

org
`---stackoveflow
    `---example
        |---EncryptedClassLoader.class
        |---Main.class
        `---SecureMain.enc

Где файлы с расширением enc зашифрованы с использованием некоторого секретного ключа.

EncryptedClassLoader может быть реализован для расшифровки файла класса перед его загрузкой:

public class EncryptedClassLoader extends ClassLoader {

    private final SecretKeySpec key;

    public EncryptedClassLoader(SecretKeySpec key) {
        this.key = key;
    }

    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            String[] segments = name.split("\\.");
            String filePath = String.join("/", segments) + ".enc";
            byte[] bytes = decryptResource(filePath);
            return defineClass(name, bytes, 0, bytes.length);
        } catch (Exception e) {
            throw new ClassNotFoundException("Unable to load class: " + name, e);
        }
    }

    private byte[] decryptResource(String filePath) throws Exception {
        File file = new File(getResource(filePath).getFile());
        byte[] bytes = Files.readAllBytes(file.toPath());
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(bytes);
    }

}

Тогдакласс Main может быть реализован для загрузки секретного ключа из аргументов командной строки, а затем для загрузки выполнения зашифрованного класса SecureMain:

public class Main {

    public static void main(String[] args) throws Exception {
        byte[] bytes = Base64.getDecoder().decode(args[0]);
        SecretKeySpec key = new SecretKeySpec(bytes, "AES");
        ClassLoader loader = new EncryptedClassLoader(key);
        Class<?> cls = loader.loadClass("com.stackoverflow.example.SecureMain");
        Runnable main = (Runnable) cls.newInstance();
        main.run();
    }

}

Наконец, JAR должен быть выполнен с переданным секретным ключомв качестве аргумента.

java -jar myjar.jar <base64 encoded key>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...