Как декодировать заголовок Basic auth
- Вставьте значение в поле Заголовок Authorization, токен Basic или URL с учётными данными. Подходит всё это:
Authorization: Basic YWRtaW46czNjcjN0OnBhc3M=Proxy-Authorization: Basic …Basic YWRtaW46czNjcjN0OnBhc3M=или только токенhttps://user:password@host/path
- Оставьте в поле Кодировка автоопределение или принудительно выберите UTF-8 или ISO-8859-1, если результат выглядит неправильно.
- Прочитайте Имя пользователя и Пароль, скопируйте нужное и загляните в Декодированные байты (hex), если какой-то символ вызывает подозрение.
Декодируется только схема Basic. Заголовки Digest и NTLM устроены иначе, и инструмент сообщит, что это другая схема.
Что показывает декодер
| Ввод | Имя пользователя | Пароль | Примечание |
|---|---|---|---|
Basic YWRtaW46czNjcjN0OnBhc3M= | admin | s3cr3t:pass | Строка делится по первому двоеточию, второе остаётся в пароле. |
dGVzdDoxMjOj | test | 123£ | Некорректный UTF-8, поэтому автоопределение переключается на Latin-1. |
dGVzdDoxMjPCow== | test | 123£ | Тот же текст, байты UTF-8. |
https://ci-bot:p%40ss@ci.example.com/ | ci-bot | p@ss | Взято из URL и percent-декодировано. |
Bearer eyJhbGciOi… | Ошибка «Это токен Bearer, а не Basic-аутентификация» и ссылка на декодер JWT. |
Автоопределение работает по порядку. Чистый ASCII декодируется одинаково в любой кодировке; байты, которые складываются в корректный UTF-8, читаются как UTF-8; всё остальное читается как ISO-8859-1, старая кодировка по умолчанию для HTTP-заголовков. Latin-1 здесь означает именно ISO-8859-1. Windows-1252 отличается от него в диапазоне 0x80–0x9F, где живут символы вроде €, поэтому пароль в Windows-1252 может отобразиться как управляющие символы.
Декодер снисходителен к неаккуратным токенам, например без дополнения = или с URL-safe - и _, и предупреждает об этом, потому что строгие серверы такие отвергнут. Если после декодирования в тексте вообще нет двоеточия, значение не было парой user:password, и инструмент так и сообщает, ничего не додумывая.
Где встречаются учётные данные Basic
- Инструменты разработчика в браузере. Вкладка «Сеть» показывает заголовки каждого запроса, включая
Authorization. - curl.
curl -vпечатает запрос, поэтому-u user:passпоявляется как> Authorization: Basic …. - HAR-файлы и перехваты прокси, где хранятся полные заголовки каждого запроса.
- Конфиги серверов и прокси, где жёстко прописанный заголовок даёт доступ к бэкенду, например
proxy_set_header Authorization "Basic …"в nginx. - Учётные данные Docker registry. В поле
authв~/.docker/config.jsonлежит Base64 отuser:password; декодер dockerconfigjson открывает файл целиком. - Логи приложений, когда фреймворк пишет входящие заголовки без маскировки.
Во всех этих местах лежит пароль открытым текстом под одним слоем кодирования, поэтому обращаться с таким значением нужно как с самим паролем. Почему кодирование ничего не защищает, объясняет статья Base64 – это не шифрование.
Декодирование заголовка на сервере
Обычно это делает фреймворк, но небольшой парсер пригодится в скриптах и тестах:
import base64
def parse_basic(header_value):
scheme, _, token = header_value.strip().partition(" ")
if scheme.lower() != "basic":
raise ValueError("not a Basic credential")
user, colon, password = base64.b64decode(token).decode("utf-8").partition(":")
if not colon:
raise ValueError("no colon in the decoded value")
return user, password
print(parse_basic("Basic YWRtaW46czNjcjN0OnBhc3M="))
Он выводит ('admin', 's3cr3t:pass'). Имя схемы не зависит от регистра, поэтому сравнивайте его в нижнем регистре, и всегда используйте partition или split(":", 1), чтобы двоеточие в пароле не потерялось. Пароль проверяйте сравнением за постоянное время, например hmac.compare_digest на закодированных байтах, а не через ==. Для обратного направления есть генератор заголовка Basic Auth, а больше рецептов Base64 собрано на странице про Python.
Вопросы и ответы
Как декодировать токен Basic auth вручную?
Отбросьте слово Basic и пробел, декодируйте остаток из Base64 и разделите по первому двоеточию. В Linux или macOS: echo 'YWRtaW46czNjcjN0OnBhc3M=' | base64 -d выводит admin:s3cr3t:pass.
Что значит «Это токен Bearer»?
В заголовке схема Bearer, значит, в нём токен, а не имя пользователя и пароль. Токены Bearer часто бывают JWT; откройте их в декодере JWT.
Почему в декодированном пароле странный символ?
Скорее всего, байты записаны в одной кодировке, а прочитаны в другой. Переключите Кодировку между автоопределением, UTF-8 и ISO-8859-1 и посмотрите на hex-байты: C2 A3 означает £ в UTF-8, а одиночный A3 даёт £ в Latin-1.
Я нашёл заголовок Basic auth в логе. Что делать?
Считайте пароль утёкшим и смените его. Затем закройте утечку: настройте прокси, веб-сервер или библиотеку логирования так, чтобы заголовок Authorization маскировался.