Введение в Ясыпта

1. Обзор

В этой статье мы рассмотрим библиотеку Jasypt (упрощенное шифрование Java)

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

2. Использование простого шифрования

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

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

Для выполнения шифрования и дешифрования с использованием очень простого алгоритма мы можем использовать класс BasicTextEncryptor из класса Jasypt. библиотека:

BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
String privateData = "secret-data";
textEncryptor.setPasswordCharArray("some-random-data".toCharArray());

Затем мы можем использовать метод encrypt () для шифрования простого текста:

String myEncryptedText = textEncryptor.encrypt(privateData);
assertNotSame(privateData, myEncryptedText);

Если мы хотим сохранить личные данные для данного пользователя в базе данных, мы можем сохранить myEncryptedText без нарушения каких-либо ограничений безопасности. Если мы хотим расшифровать данные обратно в обычный текст, мы можем использовать метод decrypt () :

String plainText = textEncryptor.decrypt(myEncryptedText);

assertEquals(plainText, privateData);

Мы видим, что расшифрованные данные равны обычным текстовым данным, которые были ранее зашифрованы.

3. Одностороннее шифрование

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

Мы можем использовать класс BasicPasswordEncryptor для выполнения одностороннего шифрования:

String password = "secret-pass";
BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
String encryptedPassword = passwordEncryptor.encryptPassword(password);

Затем мы можем сравнить уже зашифрованный пароль с паролем пользователя, который выполняет вход в систему без необходимости расшифровывать пароль, который уже хранится в базе данных:

boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword);

assertTrue(result);

4. Настройка алгоритма шифрования

Мы можем использовать более сильный алгоритм шифрования, но нам нужно помнить об установке Java Cryptography Extension (JCE) политики неограниченной юрисдикции силы Файлы для нашей JVM (инструкции по установке включены в загрузку).

В Jasypt мы можем использовать надежное шифрование с помощью класса StandardPBEStringEncryptor и настраивать его с помощью метода setAlgorithm () :

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
String privateData = "secret-data";
encryptor.setPassword("some-random-passwprd");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

Давайте установим алгоритм шифрования как PBEWithMD5AndTripleDES.

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

String encryptedText = encryptor.encrypt(privateData);
assertNotSame(privateData, encryptedText);

String plainText = encryptor.decrypt(encryptedText);
assertEquals(plainText, privateData);

5. Использование многопоточной расшифровки

Когда мы работаем на многоядерной машине, мы хотим обрабатывать дешифрование параллельно. Для достижения хорошей производительности мы можем использовать PooledPBEStringEncryptor и ​​__setPoolSize () создать пул варочных котлов. Каждый из них может использоваться разными потоками параллельно:

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
encryptor.setPassword("some-random-data");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

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

6. Использование в других системах

В заключение отметим, что библиотека Jasypt может быть интегрирована со многими другими библиотеками, включая, конечно, Spring Framework.

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

Инструкции об этих интеграциях, а также о некоторых других фреймворках, можно найти в разделе Guides на домашней странице Jasypt .

7. Заключение

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

Реализация всех этих примеров и фрагментов кода может быть найдена в проекте GitHub - это проект Maven, поэтому его легко импортировать и беги как есть.