Шпаргалка по Base64: примеры команд для Windows, Linux и Mac

Кодирование и декодирование Base64 в Windows, Linux и macOS.

Содержимое страницы

В этой шпаргалке показано, как кодировать и декодировать Base64 на Windows, Linux и macOS с помощью certutil, PowerShell и base64, включая флаги, которые различаются в зависимости от системы.

Бородатый мужчина занимается сложным кодированием ночью

Это руководство является частью раздела Инструменты разработчика: Полное руководство по современным рабочим процессам разработки. Base64 отображает каждые три входных байта в четыре символа из диапазона A–Z, a–z, 0–9, + и /. Для декодирования ключ не нужен: достаточно алфавита и символа выравнивания = для восстановления исходных байтов.

base64 в Linux переносит строку через 76 символов, если не задан флаг -w 0, base64 в macOS выводит одну строку, если не задан флаг -b, а certutil -encode в Windows добавляет баннеры сертификата вокруг перенесенных строк. Команды Linux ниже были выполнены с использованием GNU coreutils 9.7, uutils coreutils 0.10.0, BusyBox 1.37.0 и OpenSSL 3.5.5. Команды macOS используют флаги -i, -D и -b, задокументированные для этой утилиты начиная с OS X 10.7.

Кодирование и декодирование Base64 в Windows

В Windows нет встроенной команды base64. Certutil и PowerShell поставляются в системе.

Использование командной строки с Certutil

  1. Откройте командную строку.

  2. Кодирование файла в Base64:

    certutil -encode input.bin output.b64
    

    Замените input.bin на путь к вашему файлу, а output.b64 на желаемое имя выходного файла. Файл начинается с -----BEGIN CERTIFICATE-----, затем следует перенесенный текст Base64, и заканчивается -----END CERTIFICATE-----.

  3. Удаление баннерных строк и вывод содержимого:

    certutil -encode input.bin tmp.b64 && findstr /v /c:- tmp.b64 && del tmp.b64
    

    Команда findstr /v /c:- отбрасывает каждую строку, содержащую -, что удаляет оба баннера. Содержимое остается перенесенным. Результат в одну строку дает PowerShell с помощью [Convert]::ToBase64String.

Декодирование Base64 в Windows (Certutil)

certutil -decode encoded.b64 decoded.bin

Команда certutil -decode принимает файл с баннером, записанный командой -encode. Она также принимает чистый файл Base64.

Использование PowerShell для кодирования и декодирования

PowerShell [Convert]::ToBase64String пишет одну строку и не добавляет баннеров. Для большего количества автоматизации в оболочке см. Шпаргалка по PowerShell.

Кодирование файла:

[Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\file.bin"))

Кодирование строки (UTF-8):

[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("Hello, World!"))
# Вывод: SGVsbG8sIFdvcmxkIQ==

Encoding.Unicode — это UTF-16LE. Тогда те же символы кодируются как SABlAGwAbABvACwAIABXAG8AcgBsAGQAIQA=. base64 в Linux для байтов UTF-8 выдает SGVsbG8sIFdvcmxkIQ==.

Декодирование Base64 в строку:

[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("SGVsbG8sIFdvcmxkIQ=="))
# Вывод: Hello, World!

Декодирование Base64 в файл:

[System.IO.File]::WriteAllBytes("decoded.bin", [Convert]::FromBase64String((Get-Content encoded.b64 -Raw)))

FromBase64String принимает пробелы, табуляции и переводы строк. Он вызывает ошибку при наличии баннера BEGIN CERTIFICATE, поэтому файл certutil нужно обработать через certutil -decode (или сначала удалить баннеры).

Кодирование и декодирование Base64 в Linux

Команда base64 --version показывает имя бинарного файла в PATH. Строка, начинающаяся с base64 (GNU coreutils), указывает на GNU. В Ubuntu 25.10 и 26.04 /usr/bin/base64 — это uutils из пакета rust-coreutils; пакет 26.04, проверенный здесь, был uutils coreutils 0.10.0. GNU coreutils 9.7 — это gnubase64 из пакета gnu-coreutils.

Оба варианта принимают позиционный файл, -d / --decode, -i / --ignore-garbage и -w / --wrap. Перенос по умолчанию составляет 76 символов. -w 0 отключает его. uutils 0.10.0 также считает -D алиасом для -d. GNU coreutils 9.7 завершается с ошибкой invalid option -- 'D' при использовании -D.

Перенаправление (piping) и кавычки для этих однострочников описаны в Шпаргалка по Bash.

Кодирование файла в Base64

base64 input_file > output_file

Пример:

base64 myfile.txt > encoded.txt

Для вывода закодированного содержимого в терминал:

base64 myfile.txt

Кодирование строки в Base64

printf '%s' 'Hello, World!' | base64 -w 0
# Вывод: SGVsbG8sIFdvcmxkIQ==

Команда printf '%s' пишет переданные байты и останавливается. echo без -n добавляет перевод строки, поэтому тот же текст кодируется как SGVsbG8sIFdvcmxkIQo=. В bash, echo -n "Hello, World!" | base64 -w 0 совпадает со строкой printf. echo -n не является переносимым во все оболочки sh.

Отключение переноса строк (-w 0)

GNU и uutils переносят строки через 76 символов, включая случаи, когда stdout — это файл или конвейер (pipe). JSON, переменные окружения, URL и значение data в Kubernetes требуют одну строку. Функция base64encode() в Terraform возвращает одну строку стандартного Base64, поэтому вывод CLI, который сравнивается с ней, должен быть создан с отключенным переносом:

base64 -w 0 input_file > output_file

Декодирование Base64 в Linux

base64 -d encoded_file > decoded_file
# или
base64 --decode encoded_file > decoded_file

Пример:

printf '%s' 'SGVsbG8sIFdvcmxkIQ==' | base64 -d
# Вывод: Hello, World!

GNU coreutils начиная с 9.5, и uutils 0.10.0, декодируют стандартный Base64 без символа выравнивания =. printf '%s' 'SGVsbG8' | base64 -d печатает Hello. Кодировщики по-прежнему выдают выравнивание. Старые версии GNU base64 отклоняли вход без выравнивания.

-i / --ignore-garbage пропускает символы вне алфавита при декодировании. Переводы строк уже разрешены. Пробелы не разрешены, если не задан флаг -i:

printf '%s' 'SGVs bG8=' | base64 -di
# Вывод: Hello

В GNU и uutils флаг -i не принимает имя файла. Команда base64 -i input_file кодирует input_file, потому что имя — это позиционный аргумент, а -i изменяет только декодирование. В macOS -i — это флаг входного файла.

OpenSSL

OpenSSL 3.5.5 переносит строку через 64 символа. Флаг -A сохраняет вывод в одной строке:

printf '%s' 'data' | openssl base64 -e -A
# Вывод: ZGF0YQ==
printf '%s' 'ZGF0YQ==' | openssl base64 -d -A
# Вывод: data

Без -A длинный буфер разбивается каждые 64 символа, что отличается от ширины в GNU base64.

BusyBox

BusyBox 1.37.0 принимает -d и -w COL (по умолчанию 76, 0 отключает перенос). --decode завершается с ошибкой unrecognized option '--decode', а -D — с ошибкой invalid option -- 'D'. Декодирование уже пропускает символы вне алфавита: printf '%s' 'SGVs!bG8=' | busybox base64 -d печатает Hello. Флаг -i принимается, но не отображается в строке справки.

Кодирование и декодирование Base64 в macOS

В macOS поставляется BSD base64. Имя файла передается с помощью -i. Перенаправление stdin работает без -i: base64 < input_file.

Кодирование файла в Base64

base64 -i input_file > output_file

Пример:

base64 -i myfile.txt > encoded.txt

Для вывода в терминал:

base64 -i myfile.txt

Интервал переноса по умолчанию равен 0, поэтому закодированный текст представляет собой одну строку. Флаг -b count вставляет перевод строки каждые count символов. base64 -w 0 — это опция Linux; утилита macOS не использует ее. base64 -b 0 -i input_file — это явная форма для одной строки.

Кодирование и копирование в буфер обмена

base64 -i input_file | pbcopy

Декодирование Base64 на Mac

base64 -D -i encoded_file > decoded_file

-D — это декодирование. Флаги -i и -D являются интерфейсом macOS с OS X 10.7. Скрипт Linux, вызывающий base64 -d, должен вызывать base64 -D в macOS.

Флаги по реализации

Флаг GNU coreutils 9.7 uutils 0.10.0 BusyBox 1.37.0 macOS
-d / --decode Декодирование Декодирование (-D — алиас) Только -d; --decode вызывает ошибку Используется -D
-i --ignore-garbage при декодировании --ignore-garbage при декодировании Принимается, не указан в --help; байты вне алфавита уже пропускаются Входной файл
-w N Перенос на N столбцах (по умолчанию 76); 0 отключает Тот же дефолт и 0 То же; нет длинного варианта Не этот флаг; используйте -b
-b N Не принимается Не принимается Не принимается Перевод строки каждые N символов (по умолчанию 0)
Справочный текст алфавита RFC 4648 RFC 3548 (нет строки с RFC) RFC 4648

RFC 4648 отменяет RFC 3548. Стандартный алфавит в обоих документах — A–Z, a–z, 0–9, +, /.

Команда base64 -i file кодирует в Linux, потому что -i там является булевым флагом, а file — позиционный операнд. Та же команда в macOS также кодирует, потому что -i принимает file как путь к входному файлу. Команда base64 -D -i file декодирует в macOS и в uutils 0.10.0.

Base64url для JWT

Сегменты заголовка и полезной нагрузки JWT используют base64url (раздел 5 RFC 4648): - и _ заменяют + и /, а выравнивание = обычно опускается. Стандартный base64 -d затем дает ошибку. В uutils 0.10.0 ошибка — invalid input.

GNU basenc (и gnubasenc в Ubuntu 26.04) принимает форму без выравнивания:

printf '%s' 'aGVsbG8_Ky93b3JsZA' | gnubasenc --base64url -d
# Вывод: hello?+/world

uutils 0.10.0 basenc --base64url -d требует восстановления выравнивания до кратного 4. Тот же сегмент с добавленным == декодируется. Кодирование и удаление выравнивания для токена в стиле JWT:

printf '%s' 'hello?+/world' | basenc --base64url -w 0 | tr -d '='
# Вывод: aGVsbG8_Ky93b3JsZA

jq декодирует сегменты JWT с помощью @base64d, что описано в Декодирование и вывод JWT-токена.

PowerShell может построить тот же алфавит:

$b = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("hello?+/world"))
$b.TrimEnd("=").Replace("+","-").Replace("/","_")

Частые сценарии использования

Сценарий Команда / подход
Заголовок/полезная нагрузка JWT base64url, часто без выравнивания. GNU basenc --base64url -d или jq @base64d
Базовая аутентификация HTTP printf '%s' 'user:pass' | base64 -w 0 → Authorization: Basic dXNlcjpwYXNz
Секрет Kubernetes из файла kubectl create secret generic mysecret --from-file=key=file.bin
Секрет Kubernetes из строки kubectl create secret generic mysecret --from-literal=key=value
Базовая аутентификация cURL curl -u user:pass или -H "Authorization: Basic $(printf '%s' 'user:pass' | base64 -w 0)"
Data URI в HTML data:image/png;base64,$(base64 -w 0 image.png) в Linux

Команда kubectl create secret сама кодирует значения --from-literal и --from-file в Base64. Предварительное кодирование значения через base64 -w 0, как в --from-literal=key=$(base64 -w 0 file.bin), сохраняет двойное кодирование, и последующий base64 -d по-прежнему возвращает Base64. Шпаргалка по Kubernetes использует форму plain text, --from-literal=username=admin.

В манифесте каждое значение data уже является одной строкой стандартного Base64, а stringData содержит исходную строку. API-сервер объединяет stringData в data. В документации Kubernetes указано, что stringData плохо работает с server-side apply. Объект представляет собой закодированный текст; etcd хранит его незашифрованным, если не включено шифрование при хранении.

Команда curl -u записывает заголовок Authorization: Basic. Формирование этого заголовка из user:pass описано в Шпаргалка по cURL.

Когда декодирование не работает

Команда base64 --version — это проверка, когда -D или -w работают некорректно. Строки GNU и uutils различаются, и -D в Linux соответствует строке uutils.

Декодированное значение, заканчивающееся пустой строкой, содержит перевод строки от echo. Перекодируйте этот вход с помощью printf '%s'.

Команда base64 file | wc -l выводит количество перенесенных строк, выданных кодировщиком. Счетчик больше 1 в Linux означает, что команда была выполнена без -w 0.

Ошибка invalid input для текста, содержащего - или _, указывает на алфавит base64url, типичный для сегмента JWT. Декодируйте его с помощью basenc --base64url, и в uutils 0.10.0 добавляйте =, пока длина не станет кратной 4.

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.