Проблема, которую решает Base64

Компьютеры хранят всё как байты, произвольные значения от 0 до 255. Однако многие системы, передающие данные, строились для переноса текста, а не произвольных байтов: тела писем, URL, строки JSON, заголовки HTTP. Передайте им сырой байт, который случайно оказался управляющим символом или кавычкой, и они исказят его или сломаются. Base64 — стандартный способ взять любые байты и переписать их с помощью небольшого безопасного набора печатных символов, которые эти чисто текстовые каналы переносят невредимыми.

Стоит быть точным в том, что это значит: Base64 — это кодирование, а не шифрование. Оно ничего не скрывает. Кто угодно может декодировать его обратно в исходные байты без ключа и без усилий. Его единственная задача — пережить транспорт, а не хранить секрет.

Как работает кодирование

Хитрость — в перегруппировке битов. Base64 читает вход по три байта за раз. Три байта — это 24 бита, а 24 ровно делится на четыре группы по 6 бит. Каждая группа из 6 бит — число от 0 до 63, и каждое из этих 64 значений отображается на один символ алфавита Base64:

  • AZ для значений 0–25
  • az для значений 26–51
  • 09 для значений 52–61
  • + и / для значений 62 и 63

Так каждые три входных байта становятся ровно четырьмя выходными символами. Поэтому вывод Base64 всегда примерно на треть больше входа: четыре символа несут то, что несли три байта.

Зачем нужно заполнение

Вход не всегда кратен трём байтам. Когда у последней группы остаётся только один или два байта, кодировщик всё равно выдаёт полный блок из четырёх символов и заполняет пробел символом =:

  • Один оставшийся байт (8 бит) даёт два значимых символа, затем ==.
  • Два оставшихся байта (16 бит) дают три значимых символа, затем =.

= — не данные. Это маркер, сообщающий декодеру, сколько байтов на самом деле представляет последний блок, чтобы он мог отбросить заполнение и восстановить точную исходную длину. Поэтому длина строки Base64 всегда кратна четырём.

Вариант, безопасный для URL

Два символа стандартного алфавита создают проблемы в определённых местах. + и / оба имеют зарезервированные значения в URL (пробел и разделитель пути), а / к тому же недопустим во многих именах файлов. Base64URL (определён в RFC 4648) исправляет это двумя заменами и одной привычкой:

  • + становится -
  • / становится _
  • заполнение = обычно удаляется, так как длину можно вывести

В результате получается строка, которая чисто вписывается в URL, имя файла или JSON Web Token без дополнительного экранирования. Именно поэтому и -челленджи используют Base64URL вместо классической формы: эти значения живут внутри URL и токенов.

Где вы его встречаете

Как только вы узнаёте этот шаблон, Base64 повсюду: URI data:, встраивающие изображение прямо в страницу, три разделённых точками сегмента JWT, вложения писем , заголовки аутентификации HTTP Basic и сертификаты в формате . В каждом случае причина одна, сырым байтам нужно проехать через канал, который доверяет только тексту.

Вы можете вставить текст или Base64 в инструмент Base64, чтобы закодировать или декодировать его в обе стороны, стандартно и безопасно для URL, целиком в вашем браузере.