Base64

7 tools

Что такое кодирование?

Кодирование — это процесс преобразования данных из одного представления в другое. В веб-разработке кодирование используется для безопасной передачи данных через каналы, предназначенные для ограниченного набора символов.

Кодировка символов определяет, как текстовые символы отображаются на байты. Base64 преобразует двоичные данные в ASCII-текст. URL-кодирование делает произвольный текст безопасным для использования в URL.

История кодировок символов

Кодировка символов — это отображение между символами и их двоичными представлениями:

ASCII1963
128 символов

7-битный американский стандартный код. 128 символов: английские буквы, цифры, знаки препинания и управляющие коды.

Latin-11987
256 символов

Расширенный ASCII для западноевропейских языков. Добавлено 128 символов. Не подходит для не-латинских письменностей.

Unicode1991
149 186+ символов

Универсальный набор символов, охватывающий все системы письма мира. Определяет кодовые точки для более чем 149 000 символов.

UTF-81993
Весь Unicode символов

Кодировка Unicode переменной ширины, использующая 1–4 байта на символ. Совместима с ASCII. Доминирующая кодировка в вебе.

UTF-161996
Весь Unicode символов

Кодировка переменной ширины с использованием 2 или 4 байт на символ. Используется внутри Windows, Java и строк JavaScript.

UTF-322000
Весь Unicode символов

Кодировка фиксированной ширины: всегда 4 байта на символ. Редко встречается в вебе.

Почему победил UTF-8

UTF-8 стал доминирующим, потому что обратно совместим с ASCII, самосинхронизирующийся и экономичный по размеру для латинского текста. Любой ASCII-документ является допустимым UTF-8-документом.

Кодирование Base64

Base64 преобразует двоичные данные в текстовое представление, используя только 64 печатных ASCII-символа. Это необходимо, когда двоичные данные должны передаваться через текстовые каналы.

Как это работает

Base64 группирует входные байты в 3-байтные блоки и кодирует каждый блок как 4 Base64-символа. Если входные данные не кратны 3 байтам, добавляются символы заполнения =:

ВходБайты hexBase64
"Man"77 61 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

Символы = в конце указывают, сколько байт не хватало для завершения последней 3-байтной группы. Стандартный Base64 всегда производит вывод, длина которого кратна 4.

URL-кодирование

URL может содержать только ограниченный набор безопасных ASCII-символов. Любой символ вне этого набора должен быть процентно-закодирован.

Процентное кодирование заменяет каждый небезопасный байт символом %, за которым следуют два шестнадцатеричных цифры значения этого байта.

Часто кодируемые символы

СимволЗакодированоПримечания
Space%20Наиболее распространённый; используется в отправке форм как + в application/x-www-form-urlencoded
&%26Разделитель строки запроса; должен кодироваться как литеральное значение
=%3DРазделитель ключ-значение в строках запроса; кодировать как данные
+%2BИнтерпретируется как пробел в application/x-www-form-urlencoded; кодировать для сохранения +
#%23Идентификатор фрагмента; кодировать как литеральные данные в пути или запросе
/%2FРазделитель сегмента пути; кодировать как литеральные данные
:%3AРазделитель схемы; кодировать в контекстах пути и запроса
@%40Используется в mailto: и auth; кодировать как литеральные данные

encodeURI против encodeURIComponent

JavaScript предоставляет две функции кодирования с разной областью действия. encodeURI кодирует полный URL. encodeURIComponent кодирует компонент URL — все символы кроме A-Z, a-z, 0-9, -, _, ., ~.

Где кодирование встречается в веб-разработке

HTTP Basic-аутентификация

Заголовок Authorization: Basic кодирует учётные данные как Base64(пользователь:пароль). Это кодирование для удобства транспортировки, а НЕ безопасность. Всегда используйте HTTPS с Basic Auth.

Data URI

Data URI встраивают содержимое файла прямо в HTML или CSS: data:image/png;base64,.... Это исключает HTTP-запросы ценой увеличения размера документа.

MIME-вложения электронной почты

Электронная почта была разработана для 7-битного ASCII. Двоичные вложения кодируются MIME в Base64 перед передачей.

JWT-токены

JWT-токены используют кодирование Base64url для всех трёх частей, делая их безопасными для URL.

Параметры строки запроса

Любые пользовательские данные в строках запроса URL должны быть процентно-закодированы.

Интернационализированные доменные имена

Доменные имена с не-ASCII-символами кодируются с помощью Punycode (префикс xn--) для совместимости с DNS.

Часто задаваемые вопросы

Является ли Base64 формой шифрования?

Нет. Base64 — это кодирование, а не шифрование. Это обратимое преобразование без секретного ключа.

Почему вывод Base64 иногда оканчивается ==?

Base64 обрабатывает вход группами по 3 байта. Если вход не кратен 3, добавляется заполнение =.

В чём разница между Base64 и Base64url?

Base64url — URL-безопасный вариант, заменяющий + на - и / на _, обычно без заполнения =. JWT используют Base64url.

Когда использовать encodeURI вместо encodeURIComponent?

Используйте encodeURIComponent для отдельных значений. encodeURI — для полной URL-строки, где нужно сохранить символы структуры URL.

Почему UTF-8 лучше UTF-16 для веба?

UTF-8 совместим с ASCII и экономичен для латинского текста. HTTP и HTML по умолчанию используют UTF-8.

Что такое процентное кодирование?

Процентное кодирование представляет символы как % с двузначным шестнадцатеричным значением байта. Пробел — %20.

Влияет ли кодирование на производительность?

Base64 увеличивает размер данных примерно на 33% и добавляет нагрузку на CPU. URL-кодирование добавляет минимальные накладные расходы.

Что такое Punycode?

Punycode — кодировка для представления Unicode-символов в ASCII-совместимой DNS-системе. Домены вроде münchen.de кодируются как xn--mnchen-3ya.de.