Объяснение кодировки Base64: что это такое и когда ее использовать
Base64 используется повсюду в веб-разработке — он встроен в заголовки электронных писем, встроен в URI данных, используется в токенах аутентификации и заключен в двоичные файлы в текстовых протоколах. Но что это такое на самом деле? А если он шифрует данные, разве это не делает их безопасными? Ответ — нет: Base64 — это кодирование, а не шифрование. Это способ представления двоичных или произвольных данных в виде обычного текста ASCII, не более того. Понимание того, когда и зачем его использовать, может прояснить многие запутанные моменты в разработке.
Что такое Base64?
Base64 — это метод кодирования двоичных данных в 64 безопасных символа ASCII — буквы A–Z, a–z, цифры 0–9, плюс знаки и косая черта. Он работает, принимая двоичный ввод (будь то текст, изображения или необработанные байты) и разбивая его на 6-битные фрагменты. Каждый фрагмент становится индексом алфавита Base64, поэтому выходные данные всегда представляют собой читаемый текст. «64» относится к размеру алфавита: 26 + 26 + 10 + 2 = 64 символа.
Почему 64? Потому что эти символы безопасны практически во всех системах — электронной почте, старых терминалах, XML, JSON и простом тексте. Двоичный файл может быть поврежден при транспортировке, если неправильно интерпретировать специальные байты; Base64 гарантирует, что выходные данные сохранятся в неизмененном виде по любому текстовому каналу. Ты можешь кодировать и декодировать Base64 мгновенно в вашем браузере, не загружая никуда свои данные.
Base64 не является шифрованием
В этом заключается критическое различие: Base64 шифрует внешний вид данных, но любой может это изменить. Если вы закодируете пароль в Base64 secret123, это становится c2VjcmV0MTIz — но это небезопасно. Декодирование столь же тривиально. Base64 — это запутывание передачи, а не защита безопасности. Если вам нужно сохранить данные в секрете, используйте шифрование (например, AES), а не Base64. Base64 — это способ безопасной отправки зашифрованных данных через текстовый канал, но это не само шифрование.
Распространенное использование Base64
Base64 является стандартом в нескольких реальных сценариях:
- URI данных. Вместо ссылки на файл изображения вы можете встроить изображение непосредственно в HTML или CSS в качестве URI данных:
data:image/png;base64,iVBORw0KG…. Это позволяет избежать дополнительного HTTP-запроса, что полезно для маленьких значков или когда ресурсы не могут размещаться отдельно. - Вложения электронной почты. SMTP (протокол электронной почты) был разработан для текстовых сообщений. Двоичные вложения перед отправкой кодируются в формате Base64, а затем декодируются вашим почтовым клиентом при получении.
- Токены аутентификации. Многие API используют Base64 для токенов — не в целях безопасности, а потому, что токены часто представляют собой двоичные данные, которые необходимо передавать в виде читаемого текста в заголовках или URL-адресах.
- Встраивание файлов в JSON или XML. Если вам нужно включить двоичный объект (PDF, электронную таблицу, архив) в ответ API JSON, Base64 кодирует его как строку, которая не нарушает структуру JSON.
Накладные расходы на размер: Base64 увеличивает объем данных
Недостаток: выходные данные Base64 примерно на 33% больше, чем исходный двоичный файл. Это связано с тем, что вы упаковываете 8 бит входных данных в 6-битные фрагменты, а заполнение необходимо, когда длина входных данных не кратна 3. Таким образом, если вы встраиваете изображение размером 300 КБ в качестве URI данных, версия Base64 имеет размер примерно 400 КБ — медленнее загружается и анализируется. Для маленьких значков эти издержки равны сохраненному HTTP-запросу; для больших файлов обычно лучше связать их отдельно.
Варианты и связанные кодировки
Стандартное использование Base64 + и /, которые имеют особое значение в URL-адресах и именах файлов. URL-безопасный Base64 заменители - и _ вместо этого это делает его безопасным для использования в путях и строках запросов без процентного кодирования. Если вы создаете собственную схему кодирования URL-адресов, подумайте, стоит ли URL-кодирование или URL-безопасный Base64 соответствует вашим потребностям.
Base64 — одна из нескольких кодировок, решающих разные задачи. Шестнадцатеричная кодировка представляет двоичный код как два читаемых символа на байт (медленнее декодируется, но без заполнения и удобочитаем для человека), часто используется в хэшах и контрольных суммах. HTML-объекты кодировать специальные символы, например < и & поэтому они корректно отображаются на веб-страницах — это другая проблема, чем произвольный двоичный транспорт. Каждая кодировка — это инструмент для конкретной работы.