Base64
7 tools
Что такое кодирование?
Кодирование — это процесс преобразования данных из одного представления в другое. В веб-разработке кодирование используется для безопасной передачи данных через каналы, предназначенные для ограниченного набора символов.
Кодировка символов определяет, как текстовые символы отображаются на байты. Base64 преобразует двоичные данные в ASCII-текст. URL-кодирование делает произвольный текст безопасным для использования в URL.
История кодировок символов
Кодировка символов — это отображение между символами и их двоичными представлениями:
7-битный американский стандартный код. 128 символов: английские буквы, цифры, знаки препинания и управляющие коды.
Расширенный ASCII для западноевропейских языков. Добавлено 128 символов. Не подходит для не-латинских письменностей.
Универсальный набор символов, охватывающий все системы письма мира. Определяет кодовые точки для более чем 149 000 символов.
Кодировка Unicode переменной ширины, использующая 1–4 байта на символ. Совместима с ASCII. Доминирующая кодировка в вебе.
Кодировка переменной ширины с использованием 2 или 4 байт на символ. Используется внутри Windows, Java и строк JavaScript.
Кодировка фиксированной ширины: всегда 4 байта на символ. Редко встречается в вебе.
Почему победил UTF-8
UTF-8 стал доминирующим, потому что обратно совместим с ASCII, самосинхронизирующийся и экономичный по размеру для латинского текста. Любой ASCII-документ является допустимым UTF-8-документом.
Кодирование Base64
Base64 преобразует двоичные данные в текстовое представление, используя только 64 печатных ASCII-символа. Это необходимо, когда двоичные данные должны передаваться через текстовые каналы.
Как это работает
Base64 группирует входные байты в 3-байтные блоки и кодирует каждый блок как 4 Base64-символа. Если входные данные не кратны 3 байтам, добавляются символы заполнения =:
| Вход | Байты hex | Base64 |
|---|---|---|
| "Man" | 77 61 6E | TWFu |
| "Ma" | 4D 61 | TWE= |
| "M" | 4D | TQ== |
Символы = в конце указывают, сколько байт не хватало для завершения последней 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, -, _, ., ~.
Где кодирование встречается в веб-разработке
Заголовок Authorization: Basic кодирует учётные данные как Base64(пользователь:пароль). Это кодирование для удобства транспортировки, а НЕ безопасность. Всегда используйте HTTPS с Basic Auth.
Data URI встраивают содержимое файла прямо в HTML или CSS: data:image/png;base64,.... Это исключает HTTP-запросы ценой увеличения размера документа.
Электронная почта была разработана для 7-битного ASCII. Двоичные вложения кодируются MIME в Base64 перед передачей.
JWT-токены используют кодирование Base64url для всех трёх частей, делая их безопасными для URL.
Любые пользовательские данные в строках запроса URL должны быть процентно-закодированы.
Доменные имена с не-ASCII-символами кодируются с помощью Punycode (префикс xn--) для совместимости с DNS.
Часто задаваемые вопросы
Нет. Base64 — это кодирование, а не шифрование. Это обратимое преобразование без секретного ключа.
Base64 обрабатывает вход группами по 3 байта. Если вход не кратен 3, добавляется заполнение =.
Base64url — URL-безопасный вариант, заменяющий + на - и / на _, обычно без заполнения =. JWT используют Base64url.
Используйте encodeURIComponent для отдельных значений. encodeURI — для полной URL-строки, где нужно сохранить символы структуры URL.
UTF-8 совместим с ASCII и экономичен для латинского текста. HTTP и HTML по умолчанию используют UTF-8.
Процентное кодирование представляет символы как % с двузначным шестнадцатеричным значением байта. Пробел — %20.
Base64 увеличивает размер данных примерно на 33% и добавляет нагрузку на CPU. URL-кодирование добавляет минимальные накладные расходы.
Punycode — кодировка для представления Unicode-символов в ASCII-совместимой DNS-системе. Домены вроде münchen.de кодируются как xn--mnchen-3ya.de.