【Jasypt】Добавьте блокировку в свою конфигурацию

Java
【Jasypt】Добавьте блокировку в свою конфигурацию

предисловие

Несколько дней назад бывший коллега пожаловался мне, что бог в их компании выложил весь код проекта компании на github, и это был публичный проект, который мог просмотреть каждый. Что еще более ужасно, так это то, что проект содержит файлы конфигурации, информацию о базе данных, конфигурацию Redis, различные пароли открытого ключа и закрытого ключа, и они также загружаются вместе.

Если это обычная утечка бизнес-кода, ситуация неплохая, потому что другие знают ваш код, и если они хотят с вами связываться, они должны прочитать исходный код и проанализировать лазейки. А поскольку код находится в сети и проверен слой за слоем, лазейки найти непросто, по крайней мере, за короткое время. Но если кто-то другой получает информацию о вашей базе данных, то включается режим бога.

К счастью, вовремя нашли и удалили проект на гитхабе в первый раз, но нет гарантии, что проект в это время не подтянется на локал, поэтому второй - поменять все настройки в конфигурационном файле , и слушайте изменения конфигурации.Это просто, но вы должны знать, что некоторые конфигурации не могут быть обновлены в горячем режиме. Многие конфигурации можно использовать только после изменения предыдущей конфигурации. Старая и новая конфигурации не могут сосуществовать. Проект, который запускается сразу после его изменения, рухнет, и его необходимо закрыть для обслуживания. Для того, чтобы изменить конфигурацию, они потратили много сил, материальных ресурсов и энергии.

Фактически, этот болезненный урок можно избежать, предотвращение раскрытия, существует две формы общего назначения. Одним из них является использование центра конфигурации, локальный не сохраняет конфигурацию, и когда конфигурация приобретана, это должно быть оптимальное решение. Но многие раз проект, который вы использовали, не использовал центр конфигурации, а конфигурация голая в проекте. В это время вам нужна локальная зашифрованная форма для предотвращения утечек конфигурации, а общая рамка является Jasypt. В то же время, это также тема этой статьи, и нельзя сказать, непосредственно начинать, посмотреть, настроен ли он с помощью Jasypt.

полагаться

pom.xml

<dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.1</version>
</dependency>

<build>
  <plugins>
    <plugin>
      <groupId>com.github.ulisesbocchio</groupId>
      <artifactId>jasypt-maven-plugin</artifactId>
      <version>3.0.0</version>
    </plugin>
  </plugins>
</build>

иллюстрировать

Если вы используете весеннюю загрузку, то использовать jasypt легко, просто положитесь на пакет jasypt-spring-boot-starter.

Что касается jasypt-maven-plugin, то это плагин maven, который нам удобен для шифрования и расшифровки конфигурации, а его использование будет описано позже.

настроить

application.properties

my.conf.test1=123
my.conf.test2=DEC(123)
# 记得看最佳实践
jasypt.encryptor.password=lE1rl5K$

иллюстрировать

Всего есть три конфигурации, первая конфигурацияmy.conf.test1это конфигурация, не требующая шифрования, вторая конфигурацияmy.conf.test2это конфигурация, которую необходимо зашифровать, а содержимое, которое нужно зашифровать,123. Обратите внимание, что его форматDEC (контент для шифрования). Третийjasypt.encryptor.passwordКонфигурация — это наш закрытый ключ шифрования, а алгоритм шифрования по умолчанию —PBEWITHHMACSHA512ANDAES_256, ключ может быть любой строкой, иlE1rl5K$Он просто сгенерирован мной случайным образом, вы можете играть свободно.

Генерировать зашифрованный контент

Ну, пока наша конфигурация в открытом тексте.my.conf.test2это конфигурация, которую мы хотим зашифровать, она связана сmy.conf.test1Разница лишь в том, что еще одинDEC()Пакеты, что это за шифрование, на самом деле мы еще в одном шаге. Помните, как мы добавили зависимости выше и настроили плагин Maven? Теперь пришло время использовать его, выполните следующую команду в пути к каталогу нашего проекта:

Заказ

 mvn jasypt:encrypt -Djasypt.encryptor.password="lE1rl5K$" 

Обратите внимание, что при выполнении пароль должен быть заменен ключом, который вы настроили выше. После выполнения я увидел, что терминал выводит много логов, а потом уже нет. Но так ли это на самом деле?

ты снова открываешьapplication.propertiesПосмотрите, что изменилось.

my.conf.test1=123
my.conf.test2=ENC(0ZWzuD2DH0BZ8ANGMZxQyC6wv84sQLJtE6u7bcRjU+DntbMgkBvE2Z4fSzKKhYN8)
jasypt.encryptor.password=lE1rl5K$

Мы обнаружили, что две другие из трех конфигураций были такими же, как и раньше, ноmy.conf.test2Изменился, в первую очередь, от прежнего форматаDEC(xxx)сталENC(xxx). дополнительные скобки123стал 0ZWzuD2DH0BZ8ANGMZxQyC6wv84sQLJtE6u7bcRjU+DntbMgkBvE2Z4fSzKKhYN8.

Вот как это выглядит после настройки шифрования. Функция этой команды на самом деле очень проста:

  1. Загрузить конфигурацию из файла конфигурации
  2. Найдено из конфигурацииDEC(xxx)Формат и неjasyptконфигурация в начале
  3. Зашифруйте настроенным ключом и переопределите конфигурацию какENC (зашифрованное значение)

Кроме того, его также можно расшифровать через плагин, используя

mvn jasypt:decrypt -Djasypt.encryptor.password="lE1rl5K$"

Выполнение этой команды сделает обратное, поместивENC(xxx)Конфигурация содержимого расшифровывается вДЭК (открытый текст)Печатайте на консоли, обратите внимание на консоль, не меняйте файл конфигурации обратно, автор сказал это для безопасности.

проверять

TestController.java

/*
 *
 *  * *
 *  *  * blog.coder4j.cn
 *  *  * Copyright (C) 2016-2019 All Rights Reserved.
 *  *
 *
 */
package cn.coder4j.study.example.jasypt;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author buhao
 * @version TestController.java, v 0.1 2019-12-26 10:55 buhao
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @Value("${my.conf.test1}")
    private String confTest1;
    @Value("${my.conf.test2}")
    private String confTest2;

    @GetMapping("/getConf/{type}")
    @ResponseBody
    public Object getConfTest(@PathVariable Integer type) {
        if (type == 1) {
            return confTest1;
        } else {
            return confTest2;
        }
    }
}

иллюстрировать

Код на самом деле очень простой, первый проход@ValueКонфигурация читается в пути, и считываются как незашифрованная, так и зашифрованная конфигурации, а затем через интерфейс, когда параметр пути равен 1, возвращаются незашифрованные параметры, а когда параметр пути равен 2, зашифрованные параметры вернулся. . Если оба возвращают 123, мы успешны.

Для удобства проверки используйте встроенные инструменты IDEA напрямую.Вот результаты проверки:

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

image.png

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

image.png

Результат оказался таким, как мы и ожидали, шифрование прошло успешно.

Общий процесс получения конфигурации примерно противоположен описанному выше процессу зашифрованной конфигурации:

  1. Перехват операции для получения конфигурации
  2. Если перехваченная конфигурацияENC(xxx)Формат
  3. читатьjasypt.encryptor.passwordключ
  4. Расшифровать конфигурацию по ключу

Лучшие практики

Ключи хранятся отдельно от конфигурации

Видно что передавать jasypt очень удобно.Первая зависимость это вторая конфигурация.Помимо зашифрованного контента в конфигурации есть еще иjasypt.encryptor.password. В этой предыдущей статье также говорилось, что это пароль, используемый для шифрования и расшифровки, с помощью которого конфигурация может быть зашифрована и расшифрована.

image.png

В самом начале цель нашего шифрования — предотвратить утечку конфигурации при утечке кода. С конфигурацией проблем нет, мы ее зашифровали, но ключ тоже кладем в конфигурационный файл. Что это значит?Как будто вы заперли дверь, но ключ все еще в замке.

Поэтому ключ должен храниться отдельно от конфигурации, обычно передаваемой приложению через команду запуска, например следующую:

java -Djasypt.encryptor.password="password" -jar my-application.jar

Если вы немного более безопасны, вы можете поместить ключ в переменную среды и передать его приложению с помощью команды.

Асимметричное шифрование

Используемый по умолчанию алгоритм шифрования — симметричное шифрование HHMAC, поскольку существует симметрия, должна быть и асимметрия.

Симметричный и асимметричный здесь относятся к способу хранения ключа.Симметричное шифрование означает, что шифрование и дешифрование имеют общий ключ, что означает, что я могу использовать этот ключ как для шифрования, так и для дешифрования. В предыдущей статье говорилось, что для безопасности мы должны сохранить конфигурацию и ключ отдельно, как правило, в двух местах, одно — это онлайн-сервер, а другое — компьютер руководителя проекта, потому что он хочет изменить конфигурацию с открытого текста на зашифрованный текст. Почему именно на компьютере руководителя проекта, ведь невозможно всем поделиться ключом, что повысит риск утечки.

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

В настоящее время мы можем решить ее с помощью асимметричного шифрования.Преимущество этого метода заключается в том, что существует пара паролей, называемых открытым ключом и закрытым ключом соответственно.Открытый ключ используется для создания зашифрованных данных.Он размещается на сервер для расшифровки во время выполнения.Из-за ограниченного места конкретное использование можно посмотреть по ссылке в конце статьи.Официальная документация.

Экологическая изоляция

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

На самом деле связаны

  1. jasypt-spring-boot(адрес github jasypt, с подробной документацией)
  2. Эта статья ДЕМО(Поскольку длина статьи ограничена, показана только часть кода, и конкретный код был загружен на github)

image.png