Вступ до Jasypt

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. Налаштування алгоритму шифрування

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

У 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 та API setPoolSize () для створення пулу зброджувачів. Кожен з них може використовуватися різним потоком паралельно:

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

Доброю практикою є встановлення розміру пулу рівним кількості ядер машини. Код для шифрування та дешифрування такий самий, як і попередні.

6. Використання в інших фреймворках

Остаточна примітка - бібліотека Jasypt може бути інтегрована з багатьма іншими бібліотеками, включаючи, звичайно, Spring Framework.

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

Інструкції щодо цих інтеграцій, а також з деякими іншими структурами можна знайти в розділі Посібники на домашній сторінці Jasypt.

7. Висновок

У цій статті ми розглядали бібліотеку Jasypt, яка допомагає нам створювати більш безпечні програми, використовуючи вже добре відомі та перевірені алгоритми криптографії. Він покритий простим API, яким легко користуватися.

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