Розробка · 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.

Відкрити кодувальник Base64

LinkedInXFacebook