Base64 — це спосіб представити довільні бінарні дані у вигляді тексту, який складається лише з літер, цифр та символів +, / і =. Він не стискає й не шифрує дані — розмір результату зростає приблизно на третину, а прочитати початковий вміст може будь-хто, хто знає алгоритм.
Як працює кодування
Вхідні байти групуються по три (24 біти) і розбиваються на чотири шестибітні блоки. Кожному блоку відповідає один символ з алфавіту Base64 (A–Z, a–z, 0–9, +, /). Якщо довжина вхідних даних не кратна трьом байтам, у кінці додається символ-заповнювач =.
Навіщо це потрібно
Багато протоколів і форматів — email (MIME), URL-адреси, JSON, XML — розраховані на текст і не вміють коректно передавати «сирі» байти: нульові байти, керуючі символи чи послідовності, що конфліктують із синтаксисом формату. Base64 обходить це обмеження, перетворюючи будь-які бінарні дані на безпечний текст.
Типові сценарії використання
- Вкладення файлів у email через MIME.
- Передача зображень або невеликих файлів у JSON API.
- Зберігання бінарних даних у текстових полях бази даних чи конфігурації.
- Кодування частин JWT-токена (header і payload).
Чим Base64 НЕ є
Це не шифрування і не хешування. Будь-хто може декодувати Base64-рядок назад в оригінальні дані без ключа чи пароля — це лише формат представлення, а не засіб захисту інформації.
Стандартний і URL-safe алфавіти
Класичний алфавіт Base64 використовує символи + і /, які мають спеціальне значення в URL-адресах і іменах файлів. Для таких випадків існує варіант Base64URL, де + замінено на -, а / — на _. Якщо вставити результат стандартного кодування в URL без додаткового percent-encoding, символи + і / можуть спотворити адресу або конфліктувати з роздільниками шляху.
Поширена помилка: обрізаний або «зіпсований» заповнювач
Символ = у кінці рядка — це не сміття, а частина кодування, яка показує, скільки байтів бракує в останньому блоці. Якщо скопіювати Base64-рядок не повністю або видалити заповнювачі вручну, декодер поверне помилку або обірваний результат. Деякі системи (наприклад, JWT) свідомо відкидають =, і тоді довжину потрібно відновлювати перед декодуванням.