1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/core-lib-xjar

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

XJar

GitHub: https://github.com/core-lib/xjar

Инструмент безопасной шифрованной работы с JAR для Spring Boot, поддерживающий также нативные JAR.

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

Основные характеристики

  • Отсутствие вторжения в код, достаточно просто зашифровать скомпилированный JAR-пакет с помощью инструмента.
  • Полное расшифрование в памяти, снижающее риск утечки исходного кода и байткода или его декомпиляции.
  • Поддерживает все встроенные алгоритмы шифрования и расшифрования JDK.
  • Возможность выбора байткода или других ресурсных файлов для шифрования и расшифровки.
  • Поддерживает плагины Maven, делая шифрование более удобным.
  • Динамическое создание Go-запускателя для защиты пароля от утечки.

Взаимозависимости окружения

JDK 1.7+

Шаги использования#### 1. Добавление зависимостей

<проект>
    <!-- Установите репозиторий jitpack.io -->
    <репозитории>
        <репозиторий>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </репозиторий>
    </репозитории>
    <!-- Добавьте зависимость XJar -->
    <зависимости>
        <зависимость>
            <groupId>com.github.core-lib</groupId>
            <artifactId>xjar</artifactId>
            <version>4.0.1</version>
            <!-- <scope>test</scope> -->
        </зависимость>
    </зависимости>
</проект>
  • Обязательно добавьте репозиторий Maven https://jitpack.io.
  • Если вы используете тестовые классы JUnit для запуска зашифрованного кода, можно установить область действия зависимости XJar как test.

2. Зашифрование исходного кода

XCryptos.encryption()
        .from("/путь/к/читаемому/plaintext.jar")
        .use("io.xjar")
        .include("/io/xjar/**/*.class")
        .include("/mapper/**/*Mapper.xml")
        .exclude("/static/**/*")
        .exclude("/conf/*")
        .to("/путь/к/сохранению/encrypted.jar");
Метод Параметры Обязательность Описание метода
from (String jar) Или один, или другой Указывает путь до JAR-файла для шифрования
from (File jar) Указывает файл JAR-файла для шифрования
use (String password) Или один, или другой Указывает пароль для шифрования
use (String algorithm, int keySize, int ivSize, String password) Указывает алгоритм шифрования и пароль для шифрования
include (String ant) Можно вызывать несколько раз
Specifies an ANT expression of the path relative to the classpath for encryption
include (Pattern regex) Can be called multiple times Specifies a regular expression of the path relative to the classpath for encryption
exclude (String ant) Can be called multiple times Specifies an ANT expression of the path relative to the classpath for exclusion from encryption
exclude (Pattern regex) Can be called multiple times Specifies a regular expression of the path relative to the classpath for exclusion from encryption
to (String xJar) Either one or the other Sets the path for saving the encrypted JAR file and performs encryption
to (File xJar) Sets the file for saving the encrypted JAR file and performs encryption
  • When specifying an encryption algorithm, the key length and vector must fall within the range supported by that algorithm. For specific values of key lengths and vectors of cryptographic algorithms, it is recommended to use search engines such as Baidu or Google.* Использование одновременно include и exclude: шифрование будет выполнено только для ресурсов, входящих в диапазон include, но исключённых из диапазона exclude.

3. Компиляция скрипта

go build xjar.go
  • После успешной шифровки согласно шагу 2 XJar создаст исходный файл Go-стартового скрипта с названием xjar.go в том же каталоге, что и зашифрованный JAR-файл.
  • Сборка файла xjar.go на различных платформах приведёт к получению запускаемых файлов для этих платформ. На Windows имя файла будет xjar.exe, а на Linux — просто xjar.
  • Машина, используемая для компиляции, должна иметь установленную среду Go, в то время как машина для запуска может её не требовать. Подробнее о процессе установки можно узнать через поиск в интернете.
  • Из-за наличия проверки целостности JAR-файла в стартовом скрипте, последний не является универсальным. Даже при одинаковых паролях он не сможет работать на разных машинах.

4. Запуск и выполнение

/path/to/xjar /path/to/java [ОПЦИИ] -jar /path/to/encrypted.jar [АРГУМЕНТЫ]

/path/to/xjar /path/to/javaw [ОПЦИИ] -jar /path/to/encrypted.jar [АРГУМЕНТЫ]
``````markdown
nohup /path/to/xjar /path/to/java [ОПЦИИ] -jar /path/to/encrypted.jar [АРГУМЕНТЫ]

Чтобы запустить зашифрованный JAR-файл, следует перед командой запуска Java указать имя собранного Go-стартового скрипта (xjar). В случае использования nohup для запуска, данная команда должна располагаться перед именем Go-стартового скрипта (xjar). Если Go-стартовый скрипт (xjar) находится вне текущего рабочего каталога, его путь должен быть указан полностью или относительно. Поддерживаются только запуски через -jar. Запуск через -cp или -classpath невозможен. После -jar обязательно должно следовать полное имя пути к зашифрованному JAR-файлу.

Пример: если текущий рабочий каталог совпадает с местоположением xjar, и переменная окружения java установлена, команда выглядит так: ./xjar java -Xms256m -Xmx1024m -jar /path/to/encrypted.jar.

#### 1. Несоответствие spring-boot-maven-plugin с параметрами `executable=true` и `embeddedLaunchScript`
```xml
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <!-- Эти параметры необходимо удалить, поскольку данный плагин ещё не поддерживает шифрование JAR-файлов в данном режиме! Возможно, это будет реализовано в будущих версиях.
    <configuration>
        <executable>true</executable>
        <embeddedLaunchScript>...</embeddedLaunchScript>
    </configuration>
    -->
</plugin>

2. Проблемы с запуском Spring Boot при использовании JPA (Hibernate)

Если в проекте используется JPA и реализация Hibernate, то из-за того что Hibernate сам расшифровывает зашифрованные Jar-файлы, нормальный запуск невозможен. Для решения этой проблемы можно использовать следующие шаги:

  1. Клонировать XJar-Agent-Hibernate, скомпилировать mvn clean package и получить файл xjar-agent-hibernate-${version}.jar.
  2. Запустить приложение командой xjar java -javaagent:xjar-agent-hibernate-${version}.jar -jar your-spring-boot-app.jar.

3. Проблема с незавершенной загрузкой статических файлов

При шифровании статических файлов объём этих файлов увеличивается, поэтому Spring Boot использует размер файла как значение заголовка Content-Length, которое отправляет браузеру. Однако после расшифровки через XJar размер файлов восстанавливается до первоначального значения, и браузер продолжает ждать завершения загрузки.Для решения этой проблемы следует игнорировать шифрование статических файлов во время процесса шифрования. На самом деле нет необходимости шифровать статические файлы, так как даже если они будут зашифрованы, пользователи смогут просмотреть полный исходный код в браузере. Обычно статические файлы хранятся в директориях static/ и META-INF/resources/. Чтобы исключить эти файлы из процесса шифрования, можно использовать метод exclude(), как показано ниже:

XCryptos.encryption()
        .from("/путь/к/читаемому/plain-text.jar")
        .use("io.xjar")
        .exclude("/static/**/*")
        .exclude("/META-INF/resources/**/*")
        .to("/путь/к/сохраняемому/зашифрованному.jar");

4. Решение проблем с модульностью JDK 9 и выше

Из-за модульности в версиях JDK 9 и выше, пакет jdk.internal.loader недоступен для использования XJar. Для решения этой проблемы можно добавить параметр --add-opens java.base/jdk.internal.loader=ALL-UNNAMED при запуске:

xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar /путь/к/зашифрованному.jar

5. Проблема с загрузкой зависимостей XJar из jitpack.io при использовании аликовского Maven-зеркала

Чтобы решить эту проблему, можно добавить конфигурацию зеркала Maven, где в элементе mirrorOf будет указано ,!jitpack.io:```xml alimaven central,! jitpack.io aliyun maven http://maven.aliyun.com/nexus/content/repositories/central/


## Интеграция плагинов
### Для Maven проекта можно использовать интеграцию плагина [xjar-maven-plugin](https://github.com/core-lib/xjar-maven-plugin), чтобы избежать необходимости каждый раз выполнять указанный выше код для шифрования. Шифрованные JAR-файлы и исходные Go-запускеры будут автоматически генерироваться вместе с сборкой Maven.
[xjar-maven-plugin](https://github.com/core-lib/xjar-maven-plugin) GitHub: https://github.com/core-lib/xjar-maven-plugin
```xml
<проект>
    <!-- Установка репозитория плагинов jitpack.io -->
    <pluginRepositories>
        <pluginRepository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </pluginRepository>
    </pluginRepositories>
    <!-- Добавление плагина XJar Maven -->
    <build>
        <plugins>
            <plugin>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar-maven-plugin</artifactId>
                <version>4.0.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>package</phase>
                        <!-- или используйте
                        <phase>install</phase>
                        -->
                        <configuration>
                            <password>io.xjar</password>
                            <!-- необязательно
                            <algorithm/>
                            <keySize/>
                            <ivSize/>
                            <includes>
                                <include/>
                            </includes>
                            <excludes>
                                <exclude/>
                            </excludes>
                            <sourceDir/>
                            <sourceJar/>
                            <targetDir/>
``````markdown
                            <targetJar/>
                             -->
                         </configuration>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
     </build>
 </проект>

Для проектов или модулей Spring Boot этот плагин следует запускать после плагина spring-boot-maven-plugin. Это можно сделать двумя способами:

  • Разместите плагин после spring-boot-maven-plugin, так как его фаза по умолчанию также является package.
  • Установите фазу плагина в install (по умолчанию значение равно package). Команда сборки должна быть mvn clean install.

Также можно выполнить с помощью команд Maven

mvn xjar:build -Dxjar.password=io.xjar
mvn xjar:build -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/target.xjar

Однако обычно XJar плагин привязывается к определённой фазе сборки, чтобы автоматически создавать зашифрованные пакеты при сборке проекта.

mvn clean package -Dxjar.password=io.xjar
mvn clean install -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/target.xjar

Строго рекомендуется

Строго рекомендуется не указывать пароль в конфигурации плагина xjar-maven-plugin в файле pom.xml, так как это может привести к тому, что пароль будет сохранён в зашифрованном jar-файле, что делает его легко доступным. Вместо этого следует использовать команды mvn для указания ключей шифрования.## Описание параметров

Параметр Команда Описание Тип Значение по умолчанию Пример значения
password -Dxjar.password Пароль String Обязательно Любая строка, io.xjar
algorithm -Dxjar.algorithm Название алгоритма шифрования String AES/CBC/PKCS5Padding Встроенные алгоритмы шифрования Java, такие как AES/CBC/PKCS5Padding и DES/CBC/PKCS5Padding
keySize -Dxjar.keySize Длина ключа int 128 В зависимости от выбранного алгоритма шифрования, 56, 128, 256
ivSize -Dxjar.ivSize Длина вектора инициализации int 128 В зависимости от выбранного алгоритма шифрования, 128
sourceDir -Dxjar.sourceDir Каталог с исходными jar-файлами File ${project.build.directory} Каталог файлов
sourceJar -Dxjar.sourceJar Имя исходного jar-файла String ${project.build.finalName}.jar Имя файла
targetDir -Dxjar.targetDir Каталог для хранения целевых jar-файлов File ${project.build.directory} Каталог файлов
targetJar -Dxjar.targetJar Имя целевого jar-файла String ${project.build.finalName}.xjar Имя файла
includes -Dxjar.includes Выражение пути для ресурсов, требующих шифрования String[] Отсутствует io/xjar/**, mapper/*Mapper.xml, поддерживаются выражения Ant
excludes -Dxjar.excludes Выражение пути для ресурсов, не требующих шифрования String[] Отсутствует static/, META-INF/resources/, поддерживаются выражения Ant
  • Когда используются параметры includes и excludes одновременно, то ресурсы, которые указаны в includes и не указаны в excludes, будут зашифрованы. Более информации: xjar-maven-plugin

Версионный журнал

  • 4.0.1
    1. Совместимость с JDK-9 и выше версиями
  • 4.0.0
    1. Поддержка режима заполнения при шифровании/расшифровке
    2. Поддержка IV-параметра при шифровании/расшифровке
    3. Обновление запускателя
    4. Удаление опасного режима
    5. Исправление орфографических ошибок
    6. Предоставление умной системы шифрования/расшифровки для предотвращения ошибочного использования
    7. Удаление избыточных методов шифрования/расшифровки
    8. Исправление проблемы запуска nested-lib без шифрования его внутренних ресурсов в случае наличия безопасной проверки
    9. Удаление способов запуска через командную строку и ввод пароля вручную, оставив только режим Go запускатора
    10. Добавление более удобного стиля Fluent для API шифрования/расшифровки
  • 2.0.9
    1. Исправление проблемы отсутствия ProtectionDomain и CodeSource при загрузке классов XJarClassLoader
    2. Удаление префикса "v" перед номерами версий
  • 2.0.7 1.Исправление проблем совместимости шифрования между машинами с различными наборами символов
  • v2. 0. 6
    1. Решение проблемы невозможности найти точный MANIFEST.MF при запуске нескольких jar-файлов
  • v2. 0. 5
    1. Обновление зависимости LoadKit
    2. Исправление проблемы некорректного соответствия ANT-выражений /
  • v2. 0. 4
    1. Решение проблемы неподдержки опасного режима на системах Ubuntu
  • v2. 0. 3
    1. Поддержка вариативности фильтров
    2. Поддержка одновременного применения includes и excludes в xjar-maven-plugin, когда ресурсы находятся в области includes, но не в области excludes
  • v2. 0. 2
    1. Добавление способа запуска с использованием ключевых файлов для native jar, что решает проблему невозможности ввода пароля через консоль при использовании nohup и javaw
  • v2. 0. 1
    1. Добавление способа запуска с использованием ключевых файлов, что решает проблему невозможности ввода пароля через консоль при использовании nohup и javaw
    2. Исправление проблемы невыполненной очистки информации о ключах из MANIFEST.MF после расшифровки
  • v2. 0. 0
    1. Поддержка фильтрации и шифрования встроенных ресурсов JAR
    2. Несовместимость с фильтрами версии v1.x.x, переход на использование относительных выражений фильтров по отношению к URL ресурсов classpath
  • v1. 1. 4
    1. Поддержка пакетирования Spring-Boot в виде ZIP-файла, то есть внешнее управление запуском 2.Исправление проблемы невозможности запуска при отсутствии зашифрованных ресурсов
  • v1.1.3
    1. Реализация безопасного режима запуска, то есть запуск без необходимости ввода пароля!
    2. Исправление проблемы невозможности использования System.console() и замена на new Scanner(System.in)
  • v1.1.2
    1. Избежание рисков недопустимого использования фильтров пользователями
  • v1.1.1
    1. Исправление багов
  • v1.1.0
    1. Организация структуры каталогов
    2. Добавление регулярных выражений/Ant-выражений и логического оператора "не" (!) для фильтров
    3. Интеграция инструмента XEntryFilters в класс XKit
  1. По умолчанию шифрование ресурсов в Spring-Boot JAR пакете ограничивается директорией BOOT-INF/classes/* v1.0.9
  2. Устранение ошибок зависимости от версий Spring Boot
  • v1.0.8

    1. Поддержка интеграции через Maven плагин
  • v1.0.7

    1. Задание зависимости spring-boot-loader как provide
    2. Изменение метода XEntryFilter#filter(E entry) на XEntryFilter#filtrate(E entry)
    3. Преобразование конструктора Encryptor/Decryptor для приема одного фильтра вместо нескольких; внедрение инструмента XEntryFilters для объединения множества фильтров в один, что позволяет избежать ограничений фреймворка для реализации логики фильтрации пользователями.
  • v1.0.6

    1. Использование LoadKit в качестве инструмента для загрузки ресурсов
  • v1.0.5

    1. Поддержка параллельной загрузки классов с требованием JDK 1.7+, повышает производительность загрузки классов в многопоточной среде
    2. Добавление безопасного фильтра для шифрования/дешифрования Spring Boot JAR пакета, чтобы избежать шифрования незначащих ресурсов, что может привести к невозможности запуска
    3. Включение в инструменты XBoot/XJar методов шифрования/дешифрования по пути файла, что увеличивает удобство использования
  • v1.0.4 Мелкие улучшения

  • v1.0.3 Добавление по умолчанию фильтра для шифрования Spring Boot FatJar, чтобы избежать проблем запуска зашифрованного JAR пакета при отсутствии фильтра

  • v1.0.2 Устранение проблем с путями на кириллице и пробелах

  • v1.0.1 Обновление фреймворка detector

  • v1.0.0 Первый официальный выпуск

Лицензионный протокол

Apache-2.0## Вступите в чат QQ 950956093

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Инструмент для безопасного шифрования при запуске Spring Boot JAR, который также поддерживает нативные JAR. Программа основана на шифровании ресурсов внутри JAR-пакета и использовании расширенного ClassLoader для создания решения по запуску с динамическим расшифрованием, что позволяет избежать утечки исходного кода или его декомпиляции. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/core-lib-xjar.git
git@api.gitlife.ru:oschina-mirror/core-lib-xjar.git
oschina-mirror
core-lib-xjar
core-lib-xjar
master