Alibaba Druid, легкое шифрование соединения с базой данных MySQL!

Spring Boot MySQL
Alibaba Druid, легкое шифрование соединения с базой данных MySQL!

Зачем шифровать?

Текущие привычки разработки, будь то проект компании или личный проект, будут выбирать загрузку исходного кода на сервер Git (GitHub, Gitee или собственный сервер), но до тех пор, покаОтправка исходного кода на сервер общедоступной сети сопряжена с риском утечки исходного кода.И информация о конфигурации базы данных является частью исходного кода.После утечки исходного кода все данные в базе данных станут общедоступными, и в результате не следует ожидать неблагоприятных последствий (например, информации об определенном отеле).

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

Как зашифровать?

Для проектов Java, чтобы быстро внедрить шифрование базы данных,Самое простое и наиболее осуществимое решение — использовать Druid, предоставляемый Alibaba, для реализации шифрования..

Что такое Друид?

Druid (в переводе с китайского «Друид») — это лучший пул соединений с базой данных на языке Java с открытым исходным кодом от Alibaba. Druid предоставляет мощные функции мониторинга и расширения и, конечно же, включает шифрование базы данных.

Адрес открытого исходного кода друида:GitHub.com/alibaba/import…

Что может Друид?

  1. Druid может отслеживать производительность доступа к базе данных.Druid предоставляет встроенный мощный подключаемый модуль StatFilter, который может отображать подробную статистику производительности выполнения SQL, что полезно для онлайн-анализа производительности доступа к базе данных. 
  2. Заменяя пулы соединений с базой данных DBCP и C3P0, Druid предоставляет эффективный, мощный и масштабируемый пул соединений с базой данных. 
  3. 数据库密码加密,直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。 DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。 
  4. Журнал выполнения SQL, Druid предлагает различные LogFilter, для поддержки Common-Logging, Log4j и JdkLog, вы можете нажать на необходимость выбора соответствующего LogFilter, мониторинг базы данных посещает ваше приложение. 
  5. Чтобы расширить JDBC, если у вас есть требования к программированию для уровня JDBC, вы можете легко написать подключаемые модули расширения для уровня JDBC с помощью механизма Filter-Chain, предоставляемого Druid.

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

Зашифрованный поток выполнения

До шифрования пароля схема взаимодействия проекта выглядит следующим образом:image.png

После использования шифрования паролей поток взаимодействия проекта становится таким:image.png

Используйте Druid шифрование

Пример рабочей среды:

Spring Boot 2.4.3

MySQL 5.7

Java 1.8

Idea 2020.1.3

1. Добавьте зависимости Друида

Проект Мавен:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.5</version>
</dependency>

Градл-проект:

compile 'com.alibaba:druid-spring-boot-starter:1.2.5'

Получить последнюю версию Друида:Внутри репозитория MV.com/artifact/co…

2. Создайте зашифрованный текст

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

import com.alibaba.druid.filter.config.ConfigTools;

class MyTests {
    public static void main(String[] args) throws Exception {
        // 需要加密的明文命名
        String password = "youPassword"; // 【注意:这里要改为你自己的密码】
        // 调用 druid 生成私钥、公钥、密文
        ConfigTools.main(new String[]{password});
    }
}

Результат выполнения приведенного выше кода выглядит следующим образом:

privateKey:MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEApOjcMWSDzJiKVGmtcBBoQPtM9tVW2H2cnS6xZK7NrbzQXYWLQD2zefIrrx9vMvqRIHEqkmAHTuUcUXHgCxu0cwIDAQABAkAlqo5ItdWo0Jqf5zdXJlg5p2yP4HCiqCYyfKzF+2s9KEmgWZJWTctZDsgQ0iYUohORR59I+J4nabhel1x5/INpAiEA6jwSyFqMUPOh1XlrzNFek+RthOQ5n4+ALPo+vULayO0CIQC0O7JM9sIq+tg+jCGv+ypk6vbuRKY9m5W2rSRXapGm3wIgRHul3jAjIDPrF/f1HaAFL+Y0Yws7Ebyp8/yCRWF7iA0CIALbe20q8FMcHPeI4zPWCIsHCpkmb3hEkjAOOKhGIT8DAiAqiUuz92NqKeyjmOfons1ka65EzVwA3NDhZ6+IQcnuig== publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ== password:IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==

Из вышеприведенных результатов видно, что использованиеConfigToolsКласс генерирует 3 части:

  1. privateKey: закрытый ключ, который временно не будет использоваться для шифрования пароля;
  2. Publicke: открытый ключ, используемый для дешифрования паролей;
  3. пароль: пароль после шифрования.

PS: Для шифрования базы данных в основном используются publicKey (открытый ключ) и пароль (зашифрованный текст), которые преобразуют открытый текст в зашифрованный текст.

3. Добавьте конфигурацию

После выполнения вышеперечисленных операций вам нужно толькооткрытый ключизашифрованный текстДобавленный в проект профиль application.yml (или application.xml) реализует шифрование в конкретной конфигурации информации следующим образом:

spring:
  # MySQL 配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false
      username: root
      password: IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==
      # encrypt config
      filters: config
      connect-properties:
        config.decrypt: true
        config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ==

Среди них password соответствует паролю (зашифрованному тексту), сгенерированному на предыдущем шаге, а config.decrypt.key соответствует publicKey (открытому ключу), сгенерированному на предыдущем шаге, как показано на следующем рисунке:image.pngВот исходный файл конфигурации для сравнения с зашифрованным файлом конфигурации:image.png

4. Меры предосторожности - замки со вставленными ключами

После настройки предыдущих 3 шагов наша программа может нормально работать, но это далеко не конец!

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

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

правильный файл конфигурации

Затем мы устанавливаем открытый ключ Spring Boot в качестве элемента конфигурации, а затем заменяем его определенным значением при запуске проекта.Окончательная информация о конфигурации безопасности выглядит следующим образом:

spring:
  # MySQL 配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false
      username: root
      password: IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==
      # encrypt config
      filters: config
      connect-properties:
        config.decrypt: true
        config.decrypt.key: ${spring.datasource.druid.publickey}

Видно, что открытый ключ был изменен на «${spring.datasource.druid.publickey}», что эквивалентно использованию заполнителя, чтобы сначала занять яму, а затем заменить конкретное значение при запуске проекта.

PS: «spring.datasource.druid.publickey» не является фиксированным и неизменным ключом, значение ключа может быть определено пользователем.

Замена среды разработки Открытый ключ

Среде разработки нужно только настроить значение открытого ключа в параметрах запуска Idea, как показано на следующем рисунке:image.pngКогда мы вводим правильное значение открытого ключа, программа может работать нормально.Когда мы вводим неправильное значение открытого ключа, это вызовет ошибку декодирования, как показано на следующем рисунке:image.png

Замена открытого ключа в рабочей среде

В производственной среде необходимо только динамически установить значение открытого ключа при запуске пакета jar.См. следующие команды:

java -jar xxx.jar --spring.datasource.druid.publickey=ваш открытый ключ

Как работает Друид

После вышеуказанных шагов мы завершили шифрование пароля MySQL, так что при запуске проекта Spring BootПерехватчик Друида будет использовать зашифрованный текст и открытый ключ, чтобы восстановить пароль до реального пароля для использования проектом., разумеется все это без ручного вмешательства (никакого кода писать не надо), Друид уже запаковал за меня, нам нужно только пройти вышеуказанную настройку.

Какие? Хотите узнать, как Друид восстанавливает настоящий пароль с помощью зашифрованного текста и открытого ключа?

Нет проблем, удовлетворю вас, на самом делеConfigToolsСоответствующая реализация была предоставлена ​​в классе, и код выглядит следующим образом:

// 密文
String password = "VwH1mu2IUpqjfKTd+gSikiZgJTi+3Y5zFIFRfxYnH1UqHzm1K8TIHnMaV3TErBaGsVEaGV0e63pb0Ys3Wdm7Kg==";
// 公钥
String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALWIEp19IM04sB+vQXnEOH9gFNFdL5TFGSEhORgHj4MnfTfBSNaOoSgCaM8BOpjiHmwuEb7LpvmXI1x/ymUvNzECAwEAAQ==";
// 还原成真实的密码
String result = ConfigTools.decrypt(publicKey, password);
System.out.println("最终结果:" + result);

Суммировать

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

Наконец

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

Подпишитесь на официальный аккаунт «Java Chinese Community», чтобы увидеть больше галантереи друидов.