base64
Кодирование и декодирование Base64 — -d, -w0, url-safe вариант, частые ошибки с переводом строки
base64 превращает любые байты в текст из 64 безопасных символов (A–Z, a–z, 0–9, +, /) и обратно. Так передают бинарные данные там, где ждут текст: в заголовках HTTP, JSON, секретах Kubernetes, data-URI, вложениях писем.
Синтаксис
base64 [опции] [файл] # закодировать
base64 -d [опции] [файл] # декодировать
Без файла (или с -) читает stdin, результат пишет в stdout.
Опции
| Опция | Что делает |
|---|---|
-d | декодировать |
-w N | переносить строки каждые N символов (по умолчанию 76) |
-w0 | не переносить вовсе — результат одной строкой без \n в конце |
-i | при декодировании пропускать символы не из алфавита (пробелы, мусор) |
Как устроен результат
Каждые 3 байта входа превращаются в 4 символа, поэтому закодированные данные на треть длиннее исходных. Если длина входа не делится на 3, в конце добавляется выравнивание: = или ==. Пример: hello (5 байт) → aGVsbG8= (8 символов).
Родственные кодировки: basenc
basenc из coreutils умеет несколько вариантов, опции -d, -w, -i у него те же:
| Опция | Алфавит и где встречается |
|---|---|
--base64 | то же, что base64 |
--base64url | - и _ вместо + и /: JWT, токены в URL и именах файлов |
--base32 | A–Z, 2–7: TOTP-секреты, регистронезависимые идентификаторы (есть и отдельная команда base32) |
--base16 | шестнадцатеричная запись байтов в верхнем регистре |
Base64 — это кодирование, а не шифрование: любой раскодирует его одной командой.
Примеры
# закодировать строку; -n — чтобы не закодировать перевод строки
echo -n 'hello' | base64
# aGVsbG8=
# раскодировать
echo 'aGVsbG8=' | base64 -d
# файл в одну строку — для JSON, YAML, переменных
base64 -w0 image.png > image.b64
# и обратно в бинарный файл
base64 -d image.b64 > image.png
# убедиться, что после кодирования и декодирования файл не изменился
base64 image.png | base64 -d | cmp - image.png && echo 'совпадает'
# заголовок Basic-авторизации вручную
echo -n 'admin:secret' | base64
# url-safe Base64 (JWT, токены в URL)
echo -n 'hello?' | basenc --base64url
echo 'aGVsbG8_' | basenc --base64url -d
# раскодировать середину JWT — полезную нагрузку (вторая часть между точками)
echo "$TOKEN" | cut -d. -f2 | basenc --base64url -d 2>/dev/null
# base32 и шестнадцатеричный вид
echo -n 'hi' | base32
echo -n 'hi' | basenc --base16
# то же через openssl
echo -n 'hello' | openssl base64
Подводные камни
echoбез-nдобавляет\n.echo 'hello' | base64даётaGVsbG8K, а неaGVsbG8=— в закодированное попал перевод строки. Пароль или токен с ним потом не совпадёт. Используйecho -nилиprintf '%s'.- Длинный вывод переносится. Без
-w0результат режется на строки по 76 символов. В YAML, JSON или заголовок HTTP такая строка вставится с переносами и сломается. - url-safe — другой алфавит. Обычный
base64 -dна строке с-и_выдаётinvalid input. Для JWT и токенов из URL нуженbasenc --base64url -d(или заменаtr '_-' '/+'). - Нет
=в конце. В url-safe варианте выравнивание=часто отбрасывают.base64 -dтогда выведет данные, но напишетinvalid inputи вернёт код1— допиши=до длины, кратной 4. - Пробелы и мусор во входе тоже дают
invalid input. Ключ-iпропускает символы вне алфавита. - Двойное кодирование. Значения в секретах Kubernetes уже в Base64; закодировав их ещё раз, получишь строку, которая раскодируется не в то, что ожидаешь.
- Раскодированный бинарный файл не выводи в терминал — перенаправляй в файл или смотри через
xxd/od -c.