Два алфавита, один декодер
В стандартном Base64 используются + и /; в URL-safe варианте они заменены на
- и _, чтобы значение выживало внутри адреса. Сюда приходят оба и оба
раскодируются без переключателя — алфавиты не пересекаются, разрешать
неоднозначность не приходится.
Где встречается каждый
- Стандартный, с выравниванием:
Authorization: Basic, data-URI, вложения MIME - base64url, обычно без выравнивания: заголовок и полезная нагрузка JWT, PKCE-челленджи OAuth, подписанные ссылки, подписи вебхуков
Что на самом деле означает ошибка
Декодирование всегда даёт байты. Превратить байты в текст получается, только если они являются корректным UTF-8, и инструмент сообщает об ошибке, а не подставляет символы-заменители: молчаливый � хуже внятного сообщения, потому что выглядит как данные.
Если вы это увидели, на входе почти наверняка файл, а не строка.
Вопросы
Нужно ли дописывать выравнивание =?+
Нет. В base64url выравнивание по соглашению отбрасывают — в сегментах JWT его никогда нет, — поэтому инструмент восстанавливает его сам. Вставляйте строку ровно в том виде, в каком нашли.
Пишет, что байты не являются корректным UTF-8. Что делать?+
Скорее всего, на входе закодирован бинарный файл, а не текст: PNG, PDF, сжатый блоб. Base64 переносит байты, а текстом является лишь часть последовательностей. Это сообщение значит, что декодирование прошло, просто результат не читается как символы.
Можно так раскодировать JWT?+
Раскодировать каждый сегмент — можно, но [декодер JWT](/ru/t/jwt-decoder) сам разделит три части, отформатирует JSON и переведёт метку срока действия в дату, а это и есть то, что нужно.
Base64 — способ спрятать значение?+
Нет. Для декодирования не нужен ключ, и эта страница тому доказательство. Если вы нашли строку Base64 в конфиге или в адресе, считайте её содержимое публичным — оно таким и является.