[SpringBoot] SpringBoot интегрирует jasypt для шифрования важных данных
[SpringBoot] SpringBoot интегрирует jasypt для шифрования важных данных

📕Знакомство с джасыптом

Jasypt (Java Simplified Encryption) — это инструмент с открытым исходным кодом, предназначенный для упрощения операций шифрования Java. Он предоставляет простой, но мощный способ шифрования и дешифрования данных, позволяя разработчикам легко защищать конфиденциальную информацию в своих приложениях, такую ​​как пароли базы данных, ключи API и т. д.


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


Jasypt имеет очень богатые функции, включая зашифрованные файлы свойств, интеграцию Spring Framework, зашифрованную конфигурацию источника данных Hibernate, интеграцию Apache Wicket с шифрованием URL-адресов и т. д. Его также можно интегрировать с Acegi Security (также известным как Spring Security) для задач и приложений шифрования, таких как шифрование паролей, конфиденциальной информации и передачи данных, а также создание сумм для полной проверки данных. Кроме того, Jasypt предоставляет открытый API, поэтому его может использовать любое расширение криптографии Java.


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

⭐Преимущества джасыпта

  • Обеспечивает простую технологию одностороннего (дайджеста) и двустороннего шифрования.
  • Открытый API для любого поставщика JCE, а не только поставщика виртуальных машин Java по умолчанию.
  • Обеспечивает большую безопасность ваших паролей пользователей.
  • Поддержка двоичного шифрования. Jasypt позволяет переваривать и шифровать двоичные файлы (массивы байтов).
  • Числовая поддержка. Кроме текстовых и двоичных файлов,Он также позволяет дайджест и шифрование числовых значений (BigInteger и BigDecimal,шифрование Hibernate persistence поддерживает другие числовые типы).
  • Полностью потокобезопасный.
  • Поддерживает шифрование/пулирование дайджестов для обеспечения высокой производительности в многопроцессорных/многоядерных системах.
  • Включает облегченную («облегченную») версию библиотеки для лучшей управляемости в средах с ограниченным размером, таких как мобильные платформы.

🔥SpringBoot использует jasypt

📂Создайте нужные мне файлы базы данных

Язык кода:javascript
копировать
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `s_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `s_birth` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `s_sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`s_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('01', «Чжао Лэй», '1990-01-01', 'мужской');
INSERT INTO `student` VALUES ('02', «Деньги и электричество», '1990-12-21', 'мужской');
INSERT INTO `student` VALUES ('03', «Сунь Фэн», '1990-05-20', 'мужской');
INSERT INTO `student` VALUES ('04', «Ли Юн», '1990-08-06', 'мужской');
INSERT INTO `student` VALUES ('05', «Чжоу Мэй», '1991-12-01', 'женский');
INSERT INTO `student` VALUES ('06', «У Лан», '1992-03-01', 'женский');
INSERT INTO `student` VALUES ('07', «Чжэн Чжу», '1989-07-01', 'женский');
INSERT INTO `student` VALUES ('08', «Ван Цзюй», '1990-01-20', 'женский');

SET FOREIGN_KEY_CHECKS = 1;

📕Введение зависимостей

Язык кода:javascript
копировать
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.5</version>
        </dependency>
        <!--  Введение основных зависимостей      -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
       
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

🔓Файл базы данных конфигурации (предварительно не зашифрованный)

Язык кода:javascript
копировать
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 2020

🌙Создать интерфейс картографа

Здесь используется MybatisPlus,Если вы не знаете, как использовать,Вы можете прочитать другую мою статью[Весна] Базовое приложение SpringBoot, интегрирующее MybatisPlus_Simple Springboot+mybatisplus application-блог CSDN

Язык кода:javascript
копировать
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}

Добавьте его для тестирования. Метод selectList картографа вызывается напрямую.

Язык кода:javascript
копировать
    @Resource
    StudentMapper studentMapper;
    @Test
    void findStudent(){
        List<Student> students = studentMapper.selectList(null);
        students.forEach(System.out::println);
    }

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

🔒Шифрование файла конфигурации

Введение зависимостей

Язык кода:javascript
копировать
jasypt:
  encryptor:
    #  используемый алгоритм шифрования
    algorithm: PBEWITHHMACSHA512ANDAES_256
    # крупинки соли
    password: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
    property:
      prefix: ENC(
      suffix: )
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

После введения вышеуказанных зависимостей мы можем использовать jasypt для шифрования. Здесь я представляю два метода.

1. Получите зашифрованные данные посредством тестирования.
Язык кода:javascript
копировать
    @Resource
    StringEncryptor stringEncryptor;
    @Test
    void contextLoads() {
        String url = stringEncryptor.encrypt("jdbc:mysql://localhost:3306/test");
        String username = stringEncryptor.encrypt("root");
        String password = stringEncryptor.encrypt("2020");
        System.out.println("url="+url);
        System.out.println("username="+username);
        System.out.println("password="+password);
    }

Мы уже видим зашифрованные данные. Теперь я заменяю эти данные в файле конфигурации моего приложения.

Язык кода:javascript
копировать
spring:
  datasource:
    url: ENC(avXTcfv9THzOKeuZ0uo38uc+5+K1W/8YHL2Iarf0R308uIsr2x3rRwXWmEDUQvxIFn25IQjCpzHQaZ9+pwg0qOcBi+NaiF1AAVi8W9actPo=)
    driver-class-name: com.mysql.jdbc.Driver
    username: ENC(1u9zbtQFYbb6EiNNQrl1bfGiQ2LfuhDsQ8RPFbZSBTsetSbVmJi4jRDbTKwE8NQv)
    password: ENC(eG38KVuezyPxMq1kcX/eZuXZZbWKYdSY0ITlZdXCh0CXnnfH5ktdWAqiqOSmaeqB)

Теперь вызовите метод, который вы только что протестировали, интерфейс картографа, чтобы увидеть результаты.

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

Язык кода:javascript
копировать
        String url = stringEncryptor.decrypt("...");
        String username = stringEncryptor.decrypt("...");
        String password = stringEncryptor.decrypt("...");
        System.out.println("url="+url);
        System.out.println("username="+username);
        System.out.println("password="+password);

2. Через плагин сборки

В приведенном выше методе, хотя мы и зашифровали данные, мы раскрыли основные «зерен соли». Что, если мы не хотим раскрывать «зерен соли»? Затем добавьте следующий код в ваш pom-файл.


Язык кода:javascript
копировать
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-maven-plugin</artifactId>
                <version>3.0.3</version>
                <configuration>
                    <path>file:src/main/resources/application.yml</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

Измените файл конфигурации.

Язык кода:javascript
копировать
spring:
  datasource:
    url: DEC(jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false)
    driver-class-name: com.mysql.jdbc.Driver
    username: DEC(root)
    password: DEC(2020)
jasypt:
  encryptor:
    algorithm: PBEWITHHMACSHA512ANDAES_256
    property:
      prefix: ENC(
      suffix: )
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

Запустите команду ниже. Строка в конце — это ключ, который вы хотите использовать, я его сгенерировал.

Язык кода:javascript
копировать
mvn jasypt:encrypt -Djasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

Затем нажмите на свой профиль еще раз, чтобы просмотреть его. Исходные данные зашифрованы, и «соль» шифрования известна только вам.


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


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

Внедрение веб-зависимостей.

Язык кода:javascript
копировать
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

Добавьте метод в StudentController.

Язык кода:javascript
копировать
@RestController
@RequestMapping("/student")
public class StudentController {
    @Resource
    private StudentService studentService;

    @RequestMapping("/find-student")
    public String findStudent(){
        return  studentService.list().toString();
    }
}

Упакуйте проект.


Затем найдите наш упакованный проект в целевом каталоге, откройте окно cmd и выполните следующую команду. (Придется сменить крупицу соли на свою)

Язык кода:javascript
копировать
java -jar Ваше собственное имя пакета.jar --jasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 

Посетите сайт, чтобы проверить данные верны и расшифровка прошла успешно.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose