Шпаргалка по 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
-
Откройте командную строку.
-
Кодирование файла в Base64:
certutil -encode input.bin output.b64Замените
input.binна путь к вашему файлу, аoutput.b64на желаемое имя выходного файла. Файл начинается с-----BEGIN CERTIFICATE-----, затем следует перенесенный текст Base64, и заканчивается-----END CERTIFICATE-----. -
Удаление баннерных строк и вывод содержимого:
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.