← Весь справочник

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 и именах файлов
--base32A–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.

См. также

openssl · checksums · curl · kubectl · tr