Для чего используется кодировка base 64? - PullRequest
686 голосов
/ 14 октября 2008

Я слышал, как люди говорили о «кодировке base 64» здесь и там. Для чего он используется?

Ответы [ 17 ]

838 голосов
/ 14 октября 2008

Когда у вас есть некоторые двоичные данные, которые вы хотите отправить по сети, вы обычно не делаете это, просто передавая биты и байты по проводам в необработанном формате. Зачем? потому что некоторые медиа сделаны для потокового текста. Вы никогда не знаете - некоторые протоколы могут интерпретировать ваши двоичные данные как управляющие символы (например, модем), или ваши двоичные данные могут быть испорчены, потому что базовый протокол может подумать, что вы ввели специальную комбинацию символов (например, как FTP переводит строку окончания).

Таким образом, чтобы обойти это, люди кодируют двоичные данные в символы. Base64 является одним из этих типов кодировок.

Почему 64?
Потому что вы, как правило, можете рассчитывать на то, что те же 64 символа присутствуют во многих наборах символов, и вы можете быть достаточно уверены, что ваши данные окажутся на другой стороне провода не поврежденными.

191 голосов
/ 14 октября 2008

Это в основном способ кодирования произвольных двоичных данных в тексте ASCII. Требуется 4 символа на 3 байта данных, плюс, возможно, небольшой отступ в конце.

По сути, каждые 6 бит ввода кодируются в 64-символьном алфавите. «Стандартный» алфавит использует A-Z, a-z, 0-9 и + и /, с = в качестве символа заполнения. Есть URL-безопасные варианты.

Википедия - достаточно хороший источник дополнительной информации.

114 голосов
/ 14 октября 2008

Кодировка Base-64 - это способ получения двоичных данных и их преобразования в текст, чтобы их было легче передавать в таких вещах, как электронная почта и данные HTML-формы.

http://en.wikipedia.org/wiki/Base64

109 голосов
/ 14 октября 2008

Это текстовая кодировка двоичных данных, в которой результирующий текст содержит только буквы, цифры и символы «+», «/» и «=». Это удобный способ хранения / передачи двоичных данных через носитель, который специально используется для текстовых данных.

Но почему Base-64? Две альтернативы для преобразования двоичных данных в текст, которые сразу приходят на ум:

  1. Десятичное число: сохранить десятичное значение каждого байта в виде трех чисел: 045 112 101 037 и т. Д., Где каждый байт представлен 3 байтами. Данные увеличиваются в три раза.
  2. Шестнадцатеричный: сохранить байты в виде шестнадцатеричных пар: AC 47 0D 1A и т. Д., Где каждый байт представлен 2 байтами. Данные раздуты в два раза.

Base-64 отображает 3 байта (8 x 3 = 24 бита) в 4 символа, которые охватывают 6 бит (6 x 4 = 24 бита). Результат выглядит примерно так: «TWFuIGlzIGRpc3Rpb ...». Таким образом, вздутие живота только в 4/3 = 1,3333333 раза больше оригинала.

74 голосов
/ 25 августа 2012

Помимо того, что уже было сказано, два очень распространенных использования, которые не были перечислены, это

Хэши:

Хэши - это односторонние функции, которые преобразуют блок байтов в другой блок байтов фиксированного размера, например 128 или 256 бит (SHA / MD5). Преобразование полученных байтов в Base64 значительно упрощает отображение хэша, особенно когда вы сравниваете контрольную сумму на целостность. Хеши так часто встречаются в Base64, что многие люди ошибочно принимают сам Base64 как хэш.

Криптография:

Поскольку ключ шифрования должен быть не текстовым, а необработанным байтом, иногда необходимо сохранить его в файле или базе данных, для чего пригодится Base64. То же самое с результирующими зашифрованными байтами.

Обратите внимание, что хотя Base64 часто используется в криптографии, он не является механизмом безопасности. Любой может преобразовать строку Base64 обратно в ее исходные байты, поэтому ее не следует использовать в качестве средства защиты данных, а только в качестве формата для более простого отображения или хранения необработанных байтов.

Сертификаты

Сертификаты

x509 в формате PEM кодируются в формате base64. http://how2ssl.com/articles/working_with_pem_files/

25 голосов
/ 14 октября 2008

С http://en.wikipedia.org/wiki/Base64

Термин Base64 относится к конкретной кодировке передачи контента MIME. Он также используется в качестве общего термина для любой подобной схемы кодирования, которая кодирует двоичные данные, обрабатывая их численно и переводя в базовое представление 64. Конкретный выбор базы обусловлен история кодировки набора символов: можно выбрать набор из 64 символы, которые являются частью подмножества, общего для большинства кодировок, а также для печати. Эта комбинация оставляет данные вряд ли изменено в пути через системы, такие как электронная почта, которые были традиционно не 8-битный чистый.

Base64 может использоваться в различных контекстах:

  • Evolution и Thunderbird используют Base64 для маскировки паролей электронной почты [1]
  • Base64 может использоваться для передачи и хранения текста, который в противном случае мог бы вызвать коллизию разделителя
  • Base64 часто используется в качестве быстрого, но небезопасного ярлыка для скрытия секретов без дополнительных затрат на управление криптографическим ключом

  • Спаммеры используют Base64, чтобы уклониться от базовых инструментов защиты от спама, которые часто не декодируют Base64 и поэтому не могут обнаружить ключевые слова в закодированном Сообщения.

  • Base64 используется для кодирования символьных строк в файлах LDIF
  • Base64 иногда используется для встраивания двоичных данных в файл XML, используя синтаксис, подобный ...... например Firefox's bookmarks.html.
  • Base64 также используется при обмене данными с государственными устройствами печати Fiscal Signature (обычно через последовательные или параллельные порты) для минимизировать задержку при передаче символов квитанции на подпись.
  • Base64 используется для кодирования двоичных файлов, таких как изображения, в скриптах, чтобы избежать зависимости от внешних файлов.
  • Может использоваться для встраивания необработанных данных изображения в свойство CSS, например background-image.
22 голосов
/ 14 октября 2008

В первые годы существования компьютеров, когда межсистемная связь по телефонной линии не была особенно надежной, использовался быстрый и грязный метод проверки целостности данных: «битовая четность». В этом методе каждый передаваемый байт будет иметь 7-битные данные, а 8-й будет 1 или 0, чтобы общее число 1-бит в байте было четным.

Следовательно, 0x01 будет передаваться как 0x81; 0x02 будет 0x82; 0x03 останется 0x03 и т. Д.

Для дальнейшего развития этой системы, когда был определен набор символов ASCII, только 00-7F были назначены символы. (До сих пор все символы в диапазоне 80-FF нестандартны)

Многие современные маршрутизаторы проводят проверку четности и перевод байтов в аппаратные средства, заставляя подключенные к ним компьютеры строго обрабатывать 7-битные данные. Это заставляет вложения электронной почты (и все другие данные, поэтому протоколы HTTP и SMTP основаны на тексте) для преобразования в текстовый формат.

Мало кто из роутеров выжил в 90-х годах. Я сильно сомневаюсь, что какой-либо из них используется сегодня.

11 голосов
/ 14 октября 2008

Некоторые транспортные протоколы допускают передачу только буквенно-цифровых символов. Просто представьте ситуацию, когда управляющие символы используются для запуска специальных действий и / или поддерживают только ограниченную битовую ширину на символ. Base64 преобразует любой ввод в кодировку, в которой используются только буквенно-цифровые символы, +, / и = в качестве символа заполнения.

8 голосов
/ 07 июня 2015

Использование Base64, которое я собираюсь описать здесь, является своего рода хаком. Так что, если вам не нравятся хаки, пожалуйста, не продолжайте.

У меня возникли проблемы, когда я обнаружил, что MySQL utf8 не поддерживает 4-байтовые символы Unicode, поскольку он использует 3-байтовую версию utf8. Так что же я сделал для поддержки полного 4-байтового юникода поверх utf8 MySQL? Хорошо, base64 кодирует строки при сохранении в базе данных и base64 декодирует при извлечении.

Поскольку кодирование и декодирование base64 выполняется очень быстро, все вышеперечисленное прекрасно работает.

У вас есть следующие моменты, чтобы принять к сведению:

  • Кодировка Base64 занимает на 33% больше памяти

  • Строки, хранящиеся в базе данных, не будут удобочитаемыми (вы можете продать это как функцию, в которой строки базы данных используют базовую форму шифрования).

Вы можете использовать вышеуказанный метод для любого механизма хранения, который не поддерживает Unicode.

7 голосов
/ 14 октября 2008

Я использую его в практическом смысле, когда мы передаем большие двоичные объекты (изображения) через веб-сервисы. Поэтому, когда я тестирую веб-сервис C # с использованием скрипта Python, бинарный объект можно воссоздать с небольшим количеством волшебства.

[В питоне]

import base64
imageAsBytes = base64.b64decode( dataFromWS )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...