Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!30.05.2023
Пакування інформації в зашифрований пакет найменшої довжини
Турбує мене ця тема. Ну, наприклад, є невеличкий набір параметрів (на кшталт JWT). Потрібно зробити з них якнайкоротший зашифрований рядок. Може, для посилання, може, для QR-коду, і так далі. Що з цим можна зробити?
-
Кодування інформації. Логічно обрати формат, в якому структура даних не кодується разом з даними, а міститься в програмі, яка кодує та декодує. (Власне, так робить будь-який формат файлів.) Це значить, що точно не JSON та навіть не msgpack. Мені здається, що найкраще для такої задачі підходить формат Cap’n’Proto - він є логічною еволюцією формату protobuf. Тут структура пакетів задається схемою.
-
Насправді, можна обрати й msgpack, якщо кодувати не структуру, а масив. Масив — найбільш очевидна “компактна” структура даних. Проте тоді доведеться вручну збирати та розбирати ці масиви, а згодом ще й вручну версіонувати. Тож якщо є доступ до Cap’n’Proto або protobuf, то сенсу в цьому мало.
-
Компресія може згодитись й для маленьких рядків. Компресія GZIP будує словник з послідовностей, які повторюються. Тому якщо в рядках присутні повторення, то є можливість заощадити. Але є проблема — сам словник теж має бути включений у пакет. Тому важко досягти корисної компресії на маленьких рядках. Тут є корисний трюк. Замість того, щоб будувати словник з нуля для кожного пакету, можна підготувати спільний словник та тримати його окремо в коді. Це допоможе, якщо деякі фрази повторюються у більшості пакетів. Такий підхід, між іншим, використовує Cloudflare.
-
Шифрування. Тут не уникнути збільшення пакета, бо окрім даних, треба включити вектор ініціалізації та підпис. Підпис потрібний для того, щоб пакет не можна було підробити — а також щоб помітити, якщо він зіпсується Якщо я не помиляюся, то треба брати симетричне шифрування з аутентифікацією
AES-GCM
, та не вигадувати нічого свого. -
Кодування двійкового рядка в текст. Зашифрований рядок буде двійковим. Зазвичай його треба перетворити на текст. Тут можна вже обрати те, що підходить під потреби. Є Base64. Є Base58. Є Base85. Все залежить від того, який набір символів прийнятний. В ідеалі — просто залишити у двійковому вигляді.