Зачем оборачивать двоичное в текст
Многие транспорты создавались для текста, а не для сырых байтов: тела писем, документы JSON и XML, заголовки HTTP, исходные файлы. Поместите сырые двоичные данные в любой из них — и заблудший управляющий или нулевой байт может сломать разбор. Base64 решает это, заново выражая байты только безопасными печатными символами, так что двоичное может путешествовать невредимым по чисто текстовому каналу. Вот где это происходит на самом деле.
Частые сценарии
- Data URI. URL
data:встраивает небольшой ресурс прямо в разметку или CSS, напримерdata:image/png;base64,iVBORw0KGgo.... Байты изображения находятся в Base64 прямо в атрибуте, экономя отдельный сетевой запрос для крошечных ресурсов. - Электронная почта (). Вложения и не-ASCII-тела передаются с
Content-Transfer-Encoding: base64. MIME разбивает вывод на строки (классически 76 символов), чтобы старые почтовые серверы не давились длинными строками. - . Сертификаты и ключи — это байты , обёрнутые в Base64 между маркерами
-----BEGIN CERTIFICATE-----и-----END CERTIFICATE-----, со строками, разбитыми по 64 символа. PEM — причина того, что сертификат является текстовым блоком, который можно вставить в файл конфигурации. - HTTP Basic-аутентификация. Заголовок
Authorization: Basic— это Base64 отпользователь:пароль.
Цена размера
Base64 не бесплатен. Три байта становятся четырьмя символами, поэтому закодированная форма примерно на 33% больше оригинала, ещё до любых накладных расходов на переносы строк. Этот компромисс обычно оправдан ради корректности в текстовом канале, но именно поэтому вы не стали бы кодировать в Base64 большой файл, который можно отправить сырыми байтами. Для маленьких встроенных ресурсов побеждает удобство; для крупных полезных нагрузок накладные расходы говорят в пользу двоичного транспорта.
Кодировать — не значит шифровать
Пример Basic auth сам делает важнейшее замечание. Authorization: Basic dXNlcjpwYXNz выглядит непрозрачно, но dXNlcjpwYXNz — это просто Base64 от user:pass, обратимое кем угодно, без всякого ключа. Base64 не обеспечивает никакой конфиденциальности. Это кодирование (обратимое изменение представления), а не шифрование (защищённый ключом секрет) и не хеширование (односторонний отпечаток). Поэтому Basic auth безопасен только поверх TLS: транспорт шифрует заголовок, ведь Base64 этого точно не делает.
Каждый раз, видя длинную, непрозрачно выглядящую строку, декодировать её первым делом — дешёвый способ выяснить, что это. Инструмент Base64 декодирует data URI, блоки PEM и заголовки аутентификации в их сырые байты и текст, целиком в вашем браузере, так что ничего из вставленного не покидает страницу.