Розробка · 3 хв читання ·
Base64 простими словами: навіщо він і чому це не шифрування
Base64 трапляється в листах, data URI, заголовках API та JWT. Як він працює, чому дані стають на третину більшими і чому він нічого не приховує.

Base64 у програмах усюди: вкладення в листах, зображення, вбудовані в CSS, заголовок Authorization у HTTP Basic і частини JWT. У нього одне завдання — записати будь-які дані, зокрема двійкові байти, лише безпечними текстовими символами.
Як це працює
Base64 бере дані по три байти (24 біти) і ділить їх на чотири групи по 6 біт. Кожна група — число від 0 до 63, якому відповідає один із 64 символів: A-Z, a-z, 0-9, + і /. Якщо дані не діляться на трійки, кінець доповнюється знаками =.
Текст M a n
Байти 01001101 01100001 01101110
6 біт 010011 010110 000101 101110
Base64 T W F u → TWFu
Навіщо він потрібен
Багато старих систем, насамперед електронна пошта, створювалися для тексту й могли пошкодити довільні байти. Base64 перетворює будь-що на звичайні символи, які проходять такими каналами без змін. Ціна — розмір: кожні 3 байти стають 4 символами, тож закодовані дані приблизно на 33 % більші.
Це не шифрування
Ключа немає. Base64 може миттєво розкодувати будь-хто, тому він нічого не приховує. Пароль у заголовку Basic (dXNlcjpwYXNz — це просто user:pass) відкритий так само, як звичайний текст. Захищайте секрети за допомогою HTTPS і справжнього шифрування та ніколи не вважайте Base64 засобом безпеки.
Варіанти, які ви зустрінете
Base64url замінює + і / на - і _ і зазвичай прибирає доповнення, тому результат безпечний в URL та іменах файлів; його використовують JWT. Data URI вставляють закодовані дані просто в код, наприклад data:image/png;base64,iVBOR…, — це заощаджує запит для крихітних зображень, але обтяжує великі.
Розмір у цифрах
Довжина закодованих даних — 4 × ceil(n / 3) символів для n байтів, тобто приріст близько 33 %, плюс переноси рядків, якщо кодувальник їх додає.
Зображення 100 КБ → близько 133 КБ у Base64
Вкладення 1 МБ → близько 1,33 МБ (плюс переноси рядків у листі)
Чому декодування не вдається
- Немає вирівнювання: деякі системи відкидають знаки = в кінці, і суворі декодери відмовляються приймати введення. Додавайте =, доки довжина не стане кратною 4.
- Не той алфавіт: Base64url використовує - і _ замість + і /. Декодуйте його декодером Base64url або спочатку замініть символи назад.
- Переноси рядків і пробіли: пошта (MIME) переносить Base64 кожні 76 символів. Більшість декодерів ігнорує переноси, але не всі.
- Текст у неправильному кодуванні: декодування дає байти. Якщо це був текст в UTF-8, а його прочитали як Latin-1, кирилиця, літери з діакритикою та іврит перетворюються на абракадабру.
Пастка btoa в JavaScript
Вбудована в браузер функція btoa() приймає лише символи Latin-1 і видає помилку на кирилиці, івриті, китайській чи емодзі. Спершу закодуйте текст у байти UTF-8, наприклад за допомогою TextEncoder, а вже потім у Base64.
Коли його використовувати, а коли ні
Base64 — правильний інструмент, коли двійкові дані мають пройти каналом, створеним для тексту: JSON і XML, пошта, data URI та заголовки HTTP. Він не годиться, щоб ховати дані, щоб їх зменшувати (вони завжди зростають) і щоб зберігати великі файли в базі даних, де двійковий стовпець або об’єктне сховище компактніші й швидші. Якщо отримувач приймає «сирі» байти, надсилайте «сирі» байти.
Спробуйте
Кодувальник Base64 від 4Dev перетворює текст на Base64 просто під час набору. Він використовує UTF-8, тож кирилиця, емодзі й будь-який інший неанглійський текст кодуються правильно. Для зворотного перетворення є декодер Base64.