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 без ручной настройки сложных кодов, связанных с шифрованием, и файлов конфигурации.
-- ----------------------------
-- 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;
<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>
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
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}
Добавьте его для тестирования. Метод selectList картографа вызывается напрямую.
@Resource
StudentMapper studentMapper;
@Test
void findStudent(){
List<Student> students = studentMapper.selectList(null);
students.forEach(System.out::println);
}
Результат не проблема. Но для нас неизбежно небезопасно раскрывать пароль базы данных таким образом. Другие могут узнать ваш пароль базы данных, просмотрев ваш файл конфигурации. Если это ваша локальная среда, забудьте его, но если это ваша серверная среда, как только его узнают другие. Ваш пароль ужасен, поэтому давайте воспользуемся зашифрованным методом для отображения некоторого содержимого файла конфигурации.
Введение зависимостей
jasypt:
encryptor:
# используемый алгоритм шифрования
algorithm: PBEWITHHMACSHA512ANDAES_256
# крупинки соли
password: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
property:
prefix: ENC(
suffix: )
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
После введения вышеуказанных зависимостей мы можем использовать jasypt для шифрования. Здесь я представляю два метода.
@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);
}
Мы уже видим зашифрованные данные. Теперь я заменяю эти данные в файле конфигурации моего приложения.
spring:
datasource:
url: ENC(avXTcfv9THzOKeuZ0uo38uc+5+K1W/8YHL2Iarf0R308uIsr2x3rRwXWmEDUQvxIFn25IQjCpzHQaZ9+pwg0qOcBi+NaiF1AAVi8W9actPo=)
driver-class-name: com.mysql.jdbc.Driver
username: ENC(1u9zbtQFYbb6EiNNQrl1bfGiQ2LfuhDsQ8RPFbZSBTsetSbVmJi4jRDbTKwE8NQv)
password: ENC(eG38KVuezyPxMq1kcX/eZuXZZbWKYdSY0ITlZdXCh0CXnnfH5ktdWAqiqOSmaeqB)
Теперь вызовите метод, который вы только что протестировали, интерфейс картографа, чтобы увидеть результаты.
Это по-прежнему верно. Если вы не верите, вы можете вызвать приведенный ниже код, чтобы проверить, являются ли ваши зашифрованные данные вашими реальными данными после расшифровки. Вам необходимо самостоятельно заполнить параметры метода, которые представляют собой только что сгенерированные зашифрованные данные. Я не буду это демонстрировать здесь.
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);
В приведенном выше методе, хотя мы и зашифровали данные, мы раскрыли основные «зерен соли». Что, если мы не хотим раскрывать «зерен соли»? Затем добавьте следующий код в ваш pom-файл.
<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>
Измените файл конфигурации.
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
Запустите команду ниже. Строка в конце — это ключ, который вы хотите использовать, я его сгенерировал.
mvn jasypt:encrypt -Djasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
Затем нажмите на свой профиль еще раз, чтобы просмотреть его. Исходные данные зашифрованы, и «соль» шифрования известна только вам.
Затем попробуйте вызвать тестовый интерфейс картографа? Здесь будет красный флажок, поскольку ваш файл конфигурации зашифрован. Как вы можете напрямую использовать зашифрованные данные? Сначала вы должны расшифровать, но вы не указываете эту «соль» в файле конфигурации, поэтому вам придется добавлять эту «соль» другими способами.
Для удобства отображения я создаю здесь контроллер, вызываю StudentServiceImpl, а затем вызываю StudentMapper. Поскольку проект необходимо упаковать, его можно отобразить только таким образом, отображая данные через внешний интерфейс.
Внедрение веб-зависимостей.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Добавьте метод в StudentController.
@RestController
@RequestMapping("/student")
public class StudentController {
@Resource
private StudentService studentService;
@RequestMapping("/find-student")
public String findStudent(){
return studentService.list().toString();
}
}
Упакуйте проект.
Затем найдите наш упакованный проект в целевом каталоге, откройте окно cmd и выполните следующую команду. (Придется сменить крупицу соли на свою)
java -jar Ваше собственное имя пакета.jar --jasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
Посетите сайт, чтобы проверить данные верны и расшифровка прошла успешно.