предисловие
Несколько дней назад бывший коллега пожаловался мне, что бог в их компании выложил весь код проекта компании на 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.
Вот как это выглядит после настройки шифрования. Функция этой команды на самом деле очень проста:
- Загрузить конфигурацию из файла конфигурации
- Найдено из конфигурацииDEC(xxx)Формат и неjasyptконфигурация в начале
- Зашифруйте настроенным ключом и переопределите конфигурацию как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 напрямую.Вот результаты проверки:
незашифрованные параметры
зашифрованные параметры
Результат оказался таким, как мы и ожидали, шифрование прошло успешно.
Общий процесс получения конфигурации примерно противоположен описанному выше процессу зашифрованной конфигурации:
- Перехват операции для получения конфигурации
- Если перехваченная конфигурацияENC(xxx)Формат
- читатьjasypt.encryptor.passwordключ
- Расшифровать конфигурацию по ключу
Лучшие практики
Ключи хранятся отдельно от конфигурации
Видно что передавать jasypt очень удобно.Первая зависимость это вторая конфигурация.Помимо зашифрованного контента в конфигурации есть еще иjasypt.encryptor.password. В этой предыдущей статье также говорилось, что это пароль, используемый для шифрования и расшифровки, с помощью которого конфигурация может быть зашифрована и расшифрована.
В самом начале цель нашего шифрования — предотвратить утечку конфигурации при утечке кода. С конфигурацией проблем нет, мы ее зашифровали, но ключ тоже кладем в конфигурационный файл. Что это значит?Как будто вы заперли дверь, но ключ все еще в замке.
Поэтому ключ должен храниться отдельно от конфигурации, обычно передаваемой приложению через команду запуска, например следующую:
java -Djasypt.encryptor.password="password" -jar my-application.jar
Если вы немного более безопасны, вы можете поместить ключ в переменную среды и передать его приложению с помощью команды.
Асимметричное шифрование
Используемый по умолчанию алгоритм шифрования — симметричное шифрование HHMAC, поскольку существует симметрия, должна быть и асимметрия.
Симметричный и асимметричный здесь относятся к способу хранения ключа.Симметричное шифрование означает, что шифрование и дешифрование имеют общий ключ, что означает, что я могу использовать этот ключ как для шифрования, так и для дешифрования. В предыдущей статье говорилось, что для безопасности мы должны сохранить конфигурацию и ключ отдельно, как правило, в двух местах, одно — это онлайн-сервер, а другое — компьютер руководителя проекта, потому что он хочет изменить конфигурацию с открытого текста на зашифрованный текст. Почему именно на компьютере руководителя проекта, ведь невозможно всем поделиться ключом, что повысит риск утечки.
Но в этом случае возникает проблема: в проекте слишком много конфигураций: я добавляю конфигурацию, чтобы найти руководителя проекта, который поможет мне сгенерировать зашифрованный текст, добавляю конфигурацию, чтобы сгенерировать зашифрованный текст, и руководитель проекта становится специалистом по инструментам.
В настоящее время мы можем решить ее с помощью асимметричного шифрования.Преимущество этого метода заключается в том, что существует пара паролей, называемых открытым ключом и закрытым ключом соответственно.Открытый ключ используется для создания зашифрованных данных.Он размещается на сервер для расшифровки во время выполнения.Из-за ограниченного места конкретное использование можно посмотреть по ссылке в конце статьи.Официальная документация.
Экологическая изоляция
Конфигурация должна различать среду.Некоторые среды имеют более низкий уровень безопасности, например среды разработки и тестирования, и их шифрование не требуется. Предварительная и производственная среды должны быть зашифрованы, и рекомендуется использовать разные ключи, чтобы максимально избежать проблем с безопасностью.
На самом деле связаны
- jasypt-spring-boot(адрес github jasypt, с подробной документацией)
- Эта статья ДЕМО(Поскольку длина статьи ограничена, показана только часть кода, и конкретный код был загружен на github)