Jasypt: шифрование конфигурационных файлов spring-boot

В современном мире редко можно встретить приложение, которое не использует в своей работе внешние источники данных, будь то база данных или какой-нибудь сервис. Как правило, подобные внешние источники всегда защищены и требуют, как минимум, базовой аутентификации в виде логина и пароля. Принято логин и пароль хранить в properties файле приложения, но, если вы выложите подобный файл в общее хранилище (на гитхаб, к примеру), его все увидят. Поэтому многие разработчики идут другим путем и подставляют значения логина и пароля в файл properties при сборке. Это решит проблему, если у вас только одна пара логина и пароля, а если несколько? Тогда придется каждую пару прописывать при сборке. И в этом случае нам придет на помощь библиотека для шифрования jasypt. Jasypt позволяет шифровать данные в файлах конфигурации приложения и использовать только один пароль при старте приложения, с помощью которого, jasypt дешифрует всю нужную нам информацию. Давайте посмотрим на примере приложения spring-boot как это работает.

Создание простого spring-boot приложения

Заходим на сайт https://start.spring.io/ Выбираем Project – Maven, Language – Java, Spring Boot 2.4.1 (ваша версия может отличаться), Dependency – Spring Web, Packaging – Jar, Java – 11. Project Metadata значения не имеет, можете указать свою или оставить предложенную по умолчанию. Должно получится как на скриншоте:

Нажимаем кнопку GENERATE. Должен загрузиться архив со следующим содержимым:

Открываем проект любым удобным для вас редактором, я буду использовать IntelliJ IDEA 2020.3 Ultimate. Запускаем среду разработки и открываем проект: кнопка Open в окне приветствия или File – Open project, если у вас был ранее загружен проект. Выбираем корневую папку нашего скаченного ранее проекта и нажимаем ОК :

Когда загрузка завершится, вы должны увидеть следующую структуру проекта:

Структура проекта

Теперь создадим параметр конфигурации, который мы будем шифровать. Открываем файл application.properties (находится в папке resources). Добавляем в него параметр, который необходимо зашифровать:

Параметр конфигурации

Далее создадим точку входа в наше приложение. Создаем файл DemoController.java в той же папке, где лежит файл с основным файлом нашего приложения (для удобства в рамках обучающей статьи упростим структуру проекта). И вводим код на картинке:

Код контроллера приложения
Аннотация @Value служит подсказкой для Spring, что переменной нужно присвоить значение параметра demo.secret из файла application.properties (напомню, что значение для этого параметра — secret value). Само же значение переменной отдается в методе getSecret(), который доступен в браузере по url: http://localhost:8080/secret
Проверяем все ли работает. Открываем вкладку terminal и набираем (тоже самое можно сделать из командной строки находясь в корне проекта) mvn spring-boot:run:

запуск приложения

После того как запустится встроенный в spring-boot Tomcat, открываем браузер и проверяем работает ли наш сервис:

открытие приложения в браузере

Если у вас появилась надпись «secret value» значит все отлично. Останавливаем приложение (Ctrl-C в терминале). Как я писал в начале статьи, секретные значения хранить в открытом виде в исходниках крайне нежелательно, поэтому давайте его зашифруем. Для этого подключим библиотеку jasypt.

Подключение Jasypt

Переходим в файл pom.xml и в блок dependencies добавляем зависимость:

jasypt зависимость для maven
Так же добавляем плагин для maven в блок plugins:

jasypt плагин для maven

Переключаемся на терминал и обновляем зависимости maven:

обновление зависимостей maven

После того как все зависимости будут скачены переходим в файл application.properties и обворачиваем наш параметр в DEC():

добавление параметра для шифрованияDEC() указывает что именно должен шифровать плагин jasypt, который мы ранее подключили в pom.xml
Возвращаемся в терминал и шифруем наш параметр командой mvn jasypt:encrypt -Djasypt.encryptor.password=123 (в качестве пароля можете указать свой)

jasypt шифрование конфигурации

После того как плагин закончит свою работу перейдите в файл application properties и посмотрите какое теперь значение имеет наше поле:

зашифрованный параметр jasypt

Само значение у вас может отличаться, не пугайтесь, главное оно теперь зашифровано.
Возвращаемся в терминал и запускаем наше приложение командой:

запуск приложения с паролем jasypt

Как видите команда запуска дополнилась параметром для дешифрования. Если вы указывали свой пароль для шифрования, то укажите его вместо 123. После того как приложение запустится проверяем что нам вернет наш запрос в браузере:

получение зашифрованного параметра

По-прежнему secret value только теперь оно хранится в зашифрованном виде. Таким же способом можно зашифровать реквизиты подключения к базе данных и любую другую важную информацию.

Jasypt так же позволяет перешифровывать уже зашифрованные значения:

перешифровка значений jasypt

Для этого указываем наш старый пароль 123 и шифруем новым паролем 321.

Можно просто зашифровать любую строку, а затем самостоятельно добавить ее в application.properties:

шифрование любой строки jasypt

В результате получаем зашифрованную строку:

зашифрованная jasypt строка

Теперь попробуем ее дешифровать:

дешифруем строку

Получаем дешфированную строку:

дешифрованная jasypt строка

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

алгоритм для шифрования jasypt

И не забыть его указать при дешифровании:

алгоритм для дешифрования jasypt

Официальный сайт jasypt
Исходный код проекта на github

Site Footer