Как работает Base64
Base64 записывает любые байты с помощью 64 безопасных символов, чтобы двоичные данные проходили через системы, рассчитанные на текст: e-mail, JSON, URL, заголовки HTTP. Каждые 3 байта (24 бита) превращаются в 4 символа по 6 бит. Если данные не делятся на группы по 3 байта, последняя группа короче, и знаки = дополняют её до 4 символов.
M a n 01001101 01100001 01101110 010011 010110 000101 101110 T W F u → TWFu
Сначала текст превращается в байты, и эта страница использует для этого UTF-8 — кодировку, которую ожидает почти любая система. Поэтому «é» здесь превращается в w6k=, а встроенная функция браузера btoa() на таких символах выдаёт ошибку. Вариант URL-safe из RFC 4648 заменяет + и / на - и _, которые не нужно экранировать в адресах и именах файлов, и часто отбрасывает дополнение. Его используют JSON Web Token.
При декодировании страница принимает оба алфавита, отсутствующее дополнение, переводы строк и префикс data:. Если символ не относится к Base64, она говорит, какой именно и где. Если байты не являются корректным текстом UTF-8, они показываются в шестнадцатеричном виде, а при скачивании тип файла определяется по первым байтам.
Пример
Слово «foobar» — это 6 байт, поэтому оно кодируется в 8 символов без дополнения: Zm9vYmFy. «fooba» — это 5 байт, и оно получает один знак «=»: Zm9vYmE=. Одна «f» превращается в Zg==. Это тестовые значения из RFC 4648.
Вопросы
Base64 — это шифрование?
Нет. Base64 — кодирование: любой может декодировать его без ключа, как это делает эта страница. Оно ничего не скрывает. Пароль в заголовке basic-auth или в секрете Kubernetes только закодирован в Base64, поэтому защищайте его с помощью HTTPS и правил доступа, а не кодирования.
Почему Base64 больше оригинала?
Каждые 3 байта превращаются в 4 символа, поэтому результат примерно на 33 % больше, плюс до двух знаков =. Переводы строк через каждые 76 символов, как в e-mail, добавляют ещё немного. Это плата за то, что используются только безопасные текстовые символы.
Что такое URL-безопасный Base64?
Вариант из раздела 5 RFC 4648. Он использует - и _ вместо + и /, которые имеют особый смысл в URL и именах файлов, и часто опускает дополнение =. Его используют JSON Web Token и многие API. Эта страница декодирует оба варианта, а кодировать может в любом: для этого есть параметр выше.
Почему при декодировании получаются странные символы?
Либо это не текст, а, например, изображение, архив или ключ, либо текст закодирован не в UTF-8. Эта страница показывает двоичные данные в шестнадцатеричном виде и позволяет скачать их как файл. Если в остальном читаемом тексте несколько неверных букв, источник, скорее всего, использовал Latin-1 или Windows-1252.
Как декодировать Base64 в командной строке?
В Linux: echo 'Zm9vYmFy' | base64 -d. В macOS: base64 -D, а в новых версиях base64 --decode. Чтобы закодировать файл: base64 -w 0 file в Linux для одной длинной строки, base64 -i file в macOS. В PowerShell: [Convert]::FromBase64String('Zm9vYmFy').