Base64: что это и как раскодировать
Строка, которая выглядит как шифр, но им не является
Ситуация повторяется из раза в раз. В манифесте попадается поле password: cGFzc3dvcmQxMjM=. В заголовках письма вместо темы стоит =?UTF-8?B?0J/RgNC40LLQtdGCIQ==?=. В логе аутентификации мелькает Authorization: Basic YWRtaW46aHVudGVyMg==. Выглядит как что-то зашифрованное, а на самом деле это Base64 — способ записать произвольные байты 64 печатными символами: 26 строчных латинских букв, 26 заглавных, 10 цифр, плюс и слэш. Плюс знак равенства, который в сам алфавит не входит и служит только выравниванием.
Придумано это ради совместимости. Множество протоколов, которым уже не первый десяток лет, честно передают только семибитный ASCII: почта, часть HTTP-заголовков, старые форматы конфигов. Байт со значением 0x00 или 0xFF такой канал либо испортит, либо оборвёт на нём сообщение. Base64 решает проблему грубо, но надёжно: берёт по три байта, режет 24 бита на четыре группы по шесть, и каждую шестёрку (значение от 0 до 63) заменяет символом из алфавита. На выходе получается текст, который проходит куда угодно.
Отсюда два практических следствия, которые стоит запомнить раньше всего остального.
Первое: это не шифрование. Ключа нет, алгоритм открыт, обратное преобразование делает любой браузер одной строчкой. Значения в Kubernetes secret закодированы именно так, и это ровно та причина, по которой к ним нужны отдельные права доступа: сама кодировка не защищает ничего. Если вы прячете пароль в Base64 и считаете задачу решённой — задача не решена.
Второе: объём растёт примерно на треть. Три байта превращаются в четыре символа, то есть +33 % плюс один-два знака выравнивания. Килобайтная картинка станет строкой примерно на 1,37 КБ. Это важно, когда значение уходит в HTTP-заголовок или в переменную окружения, где длина не бесконечна.
Как понять, что перед вами именно Base64
Признаков немного, но они надёжные.
- Длина кратна четырём. Каноническая строка всегда делится на 4 без остатка — иначе её добили бы знаками равенства.
- Хвост из
=или==. Один знак означает, что в последней тройке был лишний байт сверх кратности, два — что осталось два байта. Если хвоста нет, строка просто оказалась кратной трём по длине исходника. - Только
A–Z,a–z,0–9,+,/. Ни пробелов внутри слова, ни дефисов, ни точек. Точки внутри — верный признак, что это JWT, а не одна строка Base64. - Отсутствие структуры. Хеш (SHA-256, MD5) — это шестнадцатеричные символы
0–9a–fфиксированной длины 64 или 32. Base64 длину имеет произвольную и содержит заглавные буквы.
Если строка начинается с eyJ — почти наверняка внутри JSON: eyJ это закодированное {". Такое начало типично для токенов и для конфигов, которые кто-то целиком упаковал в одну переменную.
Читаем содержимое
Разбор занимает три действия на странице декодирования Base64 в текст. Интерфейс страницы русский, поля подписаны буквально так:
- Вставьте строку в левое поле с подписью «Base64 на входе:». Подсказка в пустом поле показывает
SGVsbG8gV29ybGQ=— это рабочий пример, из него получаетсяHello World. Лишние пробелы и переносы строк вычищать не обязательно. - Нажмите жёлтую кнопку «Декодировать». Результат появляется справа, в поле с подписью «Результат:». Оно доступно только для чтения — редактировать вывод там не получится, это сделано намеренно.
- Оранжевая кнопка «Копировать» переносит расшифрованное в буфер обмена и на две секунды меняет свою надпись на «Скопировано!» — по ней и видно, что копирование прошло.
- Серая «Очистить» обнуляет сразу оба поля, входное и выходное.
Всё преобразование выполняет скрипт на самой странице, обращений к серверу за расшифровкой нет. Практический вывод: значение из тестового стенда можно вставить, не опасаясь, что оно уйдёт по сети. Но оно останется на экране до нажатия «Очистить», поэтому перед демонстрацией экрана поля лучше вычищать.
Обратная задача — превратить свой текст в Base64 для заголовка Basic Auth или для поля data в манифесте — решается на странице кодирования с кнопкой «Кодировать». Обе страницы и остальные соседние конвертеры собраны в разделе Base64.
Ошибки, на которых спотыкаются чаще всего
Скопировали лишнее. Самая частая причина ошибки декодирования — кавычки, приехавшие вместе со значением из JSON, или обрезающее многоточие из консоли, которая сократила длинную строку при выводе. Ещё вариант: почтовый клиент вставил мягкий перенос посреди строки. Уберите всё, что не входит в алфавит, и повторите.
Приняли base64url за Base64. В URL и в JWT плюс и слэш опасны: первый в query-строке означает пробел, второй режет путь. Поэтому применяется вариант base64url — + заменён на -, / на _, а выравнивание чаще всего просто отброшено. Такая строка на обычном декодере либо упадёт с ошибкой, либо выдаст мусор в тех местах, где встретились подменённые символы. Лечится вручную: замените дефисы на плюсы, подчёркивания на слэши, добейте длину знаками = до кратной четырём. Если же перед вами токен целиком, с двумя точками, — не мучайтесь с частями, отдайте его декодеру JWT, который сам разложит строку на «Заголовок» и «Данные».
Ждали текст, а внутри лежал файл. Строка вида data:image/png;base64,iVBORw0KGgo... — это картинка. Если скормить её текстовому декодеру, в поле «Результат:» окажется каша из служебных символов, и это не поломка, а честный ответ: PNG действительно так и выглядит, если читать его как текст. Двоичное содержимое надо восстанавливать в файл — для этого есть страница Base64 в файл. И префикс data:image/png;base64, перед вставкой надо отрезать: это не часть данных, а служебная обёртка для CSS и HTML.
Кириллица развалилась. Здесь важно, что Base64 хранит байты и понятия не имеет о кодировке. Декодер восстанавливает байты и трактует их как UTF-8. Если исходник был в UTF-8 — русский текст читается символ в символ. Если строку когда-то закодировали из windows-1251, байты вернутся правильные, а прочитаны будут неверно, и вы увидите знакомые кракозябры. Перекодировать такое приходится отдельным шагом, уже после расшифровки; сама страница смены кодировки не предлагает.
Ожидали загрузки файла. Страница работает только с текстом, вставленным в поле. Кнопки выбора файла на ней нет, .txt с длинной строкой перетащить некуда — содержимое придётся открыть и скопировать вручную. Для обратной операции с файлом, когда нужно получить Base64 из готового документа или картинки, существует отдельный инструмент в том же разделе.
Когда декодирование не поможет
Стоит честно ограничить ожидания. Если строка выглядит как случайный набор символов, но при декодировании выдаёт бессмыслицу, — вариантов два. Либо это вообще не Base64: хеш, идентификатор сессии, подпись. Либо данные перед кодированием сжали или зашифровали, и Base64 здесь — только внешняя упаковка. Второй случай виден по результату: получаются байты без всякой текстовой структуры, часто начинающиеся с сигнатуры архива. Прочитать такое без ключа или без распаковки не выйдет, и никакой декодер эту задачу не решит.
Как отличить Base64 от хеша?
По алфавиту и по длине. Хеш MD5 — это ровно 32 шестнадцатеричных символа, SHA-256 — 64, и только цифры с буквами `a–f` в нижнем регистре. В Base64 есть заглавные буквы, плюс, слэш, а длина зависит от исходника и кратна четырём. Главное отличие по сути: хеш необратим, из него исходные данные не достать, а Base64 разворачивается обратно всегда.
Что делать со строкой, которая начинается с `data:image/png;base64,`?
Отрезать всё до запятой включительно — это заголовок data URI, описывающий тип содержимого, а не сами данные. Остаток и есть Base64, но внутри картинка, а не текст. В текстовом декодере вы получите нечитаемые символы; правильный путь — страница восстановления файла, которая соберёт из строки скачиваемый PNG.
Почему `base64 -d` в терминале ругается на невалидный ввод?
Утилита строже браузера. Она спотыкается на переносах строк, на пробелах и на символах base64url, которые в стандартном алфавите не значатся. Помогает флаг `-i` (игнорировать мусор) в GNU coreutils, но надёжнее почистить строку. Если под рукой нет терминала или строка приехала из чата с невидимыми символами, проще вставить её в поле на странице декодирования и посмотреть результат глазами.
Безопасно ли вставлять рабочий секрет в онлайн-декодер?
Конкретно эта страница считает всё скриптом внутри вкладки и никуда строку не отправляет — это видно по исходному коду. Но привычка важнее одного инструмента: боевой пароль или живой токен доступа лучше не носить по вкладкам вообще, а брать значение из тестового контура. Если секрет всё-таки был вставлен и вы не уверены в окружении — ротация ключа стоит дешевле разбирательства.