В современном мире редко можно встретить приложение, которое не использует в своей работе внешние источники данных, будь то база данных или какой-нибудь сервис. Как правило, подобные внешние источники всегда защищены и требуют, как минимум, базовой аутентификации в виде логина и пароля. Принято логин и пароль хранить в 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 добавляем зависимость:
Так же добавляем плагин для maven в блок plugins:
Переключаемся на терминал и обновляем зависимости maven:
После того как все зависимости будут скачены переходим в файл application.properties и обворачиваем наш параметр в DEC():
DEC() указывает что именно должен шифровать плагин jasypt, который мы ранее подключили в pom.xml
Возвращаемся в терминал и шифруем наш параметр командой mvn jasypt:encrypt -Djasypt.encryptor.password=123 (в качестве пароля можете указать свой)
После того как плагин закончит свою работу перейдите в файл application properties и посмотрите какое теперь значение имеет наше поле:
Само значение у вас может отличаться, не пугайтесь, главное оно теперь зашифровано.
Возвращаемся в терминал и запускаем наше приложение командой:
Как видите команда запуска дополнилась параметром для дешифрования. Если вы указывали свой пароль для шифрования, то укажите его вместо 123. После того как приложение запустится проверяем что нам вернет наш запрос в браузере:
По-прежнему secret value только теперь оно хранится в зашифрованном виде. Таким же способом можно зашифровать реквизиты подключения к базе данных и любую другую важную информацию.
Jasypt так же позволяет перешифровывать уже зашифрованные значения:
Для этого указываем наш старый пароль 123 и шифруем новым паролем 321.
Можно просто зашифровать любую строку, а затем самостоятельно добавить ее в application.properties:
В результате получаем зашифрованную строку:
Теперь попробуем ее дешифровать:
Получаем дешфированную строку:
При шифровании можно явно указать алгоритм, который будет использоваться:
И не забыть его указать при дешифровании: