Симетричне шифрування AES Java, а також патерн - Проміжний результат, dev64
Programming
Симетричне шифрування AES Java, а також патерн "Проміжний результат"
Сьогодні у проекті довелося терміново прикручувати HMAC хешування та AES шифрування. Як завжди в таких випадках буває, щось нагуглив, трохи адаптував і застосував. Посилання.
Злегка видозмінений код нижче.
Створюється клас AesCrypt. У конструкторі передається пароль шифрування/дешифрування. Потім шифрується тестовий рядок за допомогою encrypt і розшифровується за допомогою decrypt. Розшифрована порівнюється з вихідною для перевірки.
Нижче реалізація класу AesCrypt та виключення AesCryptException.
На прикладі даного класу хотів би також продемонструвати один патерн програмування. Суть патерну ось у чому. У класу AesCrypt описані 2 публічні методи encrypt та decrypt. Обидва ці методи кидають виняток - обгортку AesException. Можливо, вам захочеться щоб цей клас кидав інший виняток або, наприклад, кидав оригінальні винятки, або ігнорував винятки. Звичайно, найпростіший спосіб — просто в кожному конкретному випадку копіювати клас і змінювати належним чином. Однак це не найкраще рішення. Є інший підхід. Переписати методи encrypt та decrypt, щоб вони повертали не результат, а проміжний об'єкт — білдер результату. А вже у цього білдера зробити функції, що працюють по-різному — викиди, що кидають, ігнорують винятки, що кидають зазначений виняток. Для цього зручно застосувати вкладений об'єкт:
І нижче, юніт тест, який демонструє підхід.
Тепер замість одного варіанта з'явилися різні варіанти викликів. Просто кидають виняток або кидають певний виняток, або взагалі замість винятку повертають спеціальний рядок, що означає, що сталося виняток. Як до вподоби. На самомуНасправді, з точки зору патернів обробки винятків, приклад з обгорткою orThrow(Throwable e) не надто хороший. Оскільки втрачається cause виняток. Однак це дуже просто виправити: використовувати метод initCause():
Наведений приклад лише для демонстрації підходу. Можна знайти йому застосування, я певен.