Для чего используется кодировка base 64?
========================================

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

 

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

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

  **Почему 64?**   

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

 

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

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

 [Wikipedia](https://en.wikipedia.org/wiki/Base64) является достаточно хорошим источником дополнительной информации.

 

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

 [http://en.wikipedia.org/wiki/Base64](https://en.wikipedia.org/wiki/Base64)

 

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

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

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

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

 

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

  **Хэш:**

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

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

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

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

  **Сертификаты**

Сертификаты x509 в формате PEM кодируются базой 64. <http://how2ssl.com/articles/working_with_pem_files/>

 

От [http://en.wikipedia.org/wiki/Base64](https://en.wikipedia.org/wiki/Base64)

>  Термин Base64 относится к определенному кодированию передачи содержимого MIME. Он также используется в качестве общего термина для любой аналогичной схемы кодирования, которая кодирует двоичные данные, обрабатывая его численно и переводя его в представление базы 64. Конкретный выбор базы обусловлен история кодировки набора символов: можно выбрать набор из 64 символы, которые являются частью подмножества, общего для большинства кодировок, а также для печати. Эта комбинация оставляет данные, которые вряд ли будут измененные в пути через системы, такие как электронная почта, которые были традиционно не 8-битный чистый.
> 
>  Base64 может использоваться в различных контекстах:
> 
>  * Evolution и Thunderbird используют Base64 для обфускации паролей электронной почты [1]
> * Base64 может использоваться для передачи и хранения текста, который в противном случае мог бы вызвать столкновение с разделителями.
> * Base64 часто используется как быстрый, но небезопасный ярлык для скрытия секретов, не прибегая к накладным расходам на управление криптографическим ключом.
> * Спамеры используют Base64 для обхода базовых средств защиты от спама, которые часто не декодируют Base64 и поэтому не могут обнаружить ключевые слова в закодированном Сообщения.
> * Base64 используется для кодирования символьных строк в файлах LDIF.
> * Base64 иногда используется для встраивания двоичных данных в XML файл с использованием синтаксиса, аналогичного...... например. Firefox bookmarks.html.
> * Base64 также используется при общении с государственными устройствами печати фискальной подписи (обычно, через последовательные или параллельные порты) до минимизировать задержку при передаче символов чека для подписания.
> * Base64 используется для кодирования двоичных файлов, таких как изображения внутри скриптов, чтобы избежать зависания внешних файлов.
> * Может использоваться для вставки необработанных данных изображения в свойство CSS, такое как фоновое изображение.
> 

 

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

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

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

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

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

 

Некоторые транспортные протоколы позволяют передавать только буквенно-цифровые символы. Представьте себе ситуацию, когда управляющие символы используются для запуска специальных действий и/или которые поддерживают только ограниченную ширину бита для каждого символа. [Base64](https://en.wikipedia.org/wiki/Base64) преобразует любой вход в кодировку, которая использует только буквенно-цифровые символы, `+`, `/` и `=` как символ заполнения.

 

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

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

Так как кодировка и декодирование base64 очень быстрая, это отлично работает.

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

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

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

 

Он используется для преобразования произвольных двоичных данных в текст ASCII.

Например, вложения электронной почты отправляются таким образом.

 

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

[В python]

```
import base64
imageAsBytes = base64.b64decode( dataFromWS )

```
 

 "Схемы кодирования Base64 обычно используются, когда необходимо кодировать двоичные данные, которые должны храниться и передаваться через носитель, предназначенный для работы с текстовыми данными. Это необходимо для того, чтобы данные оставались без изменений во время транспортировки" (Wiki, 2017)

  Пример может быть следующим: у вас есть веб-сервис, который принимает только символы ASCII. Вы хотите сохранить, а затем перенести данные пользователей в другое место (API), но получатель хочет получить нетронутые данные. Base64 для этого. , , Единственным недостатком является то, что для кодирования base64 потребуется примерно на 33% больше места, чем для обычных строк.

  Другой пример: :: uenc = url encoded = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = [http://loc.querytip.com/asics-men-ml-s.iixx.ii](http://loc.querytip.com/asics-men-s-gel-kayano-xii.html)

  Как вы можете видеть, мы не можем поместить char "/" в URL, если мы хотим отправить последний посещенный URL в качестве параметра, потому что мы нарушаем правило атрибута/значения для "MOD rewrite" - параметр GET.

  Полный пример будет: " [http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product/93/](http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product/93) "

 

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

 

Чтобы немного рассказать о том, что говорит Брэд: многие механизмы транспорта для электронной почты и Usenet и другие способы перемещения данных не являются "8-битными", что означает, что символы вне стандартного набора символов ascii могут быть искажены при транзите - например, 0x0D можно рассматривать как возврат каретки и превращаться в возврат каретки и линию. База 64 отображает все двоичные символы на несколько стандартных букв ascii и цифр и знаков препинания, поэтому они не будут искажены таким образом.

 

Base64

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

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

 

Base64 может использоваться для многих целей.

Основной причиной является преобразование двоичных данных в нечто проходимое.

Я иногда использую его для передачи данных JSON с одного сайта на другой, хранения информации
в файлах cookie о пользователе.

Примечание:
Вы "можете" использовать его для шифрования - я не понимаю, почему люди говорят, что вы не можете, и что это не шифрование, хотя оно было бы легко разрушаемым и не одобрялось. Шифрование означает не что иное, как преобразование одной строки данных в другую строку данных, которая может быть позже расшифрована или нет, и что делает base64.

 

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

  Проблема с двоичными данными состоит в том, что они содержат нулевые символы, которые в некоторых языках, таких как C, C++ представляют конец символьной строки, поэтому отправка двоичных данных в необработанном виде, содержащем NULL-байты, не дает файлу полностью считываться и приводит к поврежденным данным.,

  Например:

  В C и C++ этот "нулевой" символ показывает конец строки. Так что "Привет" хранится так:

  ПРИВЕТ

  72 69 76 76 79 00

  00 говорит "остановись здесь".

  Теперь давайте рассмотрим, как работает кодировка BASE64.

  Обратите внимание: длина строки должна быть кратна 3.

  **Пример 1:**

  Строка для кодирования: "туз", длина = 3

  1) Конвертировать каждый символ в десятичную.

  а = 97, с = 99, е = 101

  [![enter image description here]()](/img/767b6cee5f5743a6674fdc4aeb1450da.png)

  2) Измените каждое десятичное на 8-битное двоичное представление.

  97 = 01100001, 99 = 01100011, 101 = 01100101

  Совмещенный: 01100001 01100011 01100101

  3) Отдельно в группе 6 бит.

  011000 010110 001101 100101

  4) Рассчитать двоичное в десятичное

  011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37

  5) Преобразование десятичных символов в base64 с использованием диаграммы base64.

  24 = Y, 22 = W, 13 = N, 37 = l

  "ace" => "YWNl"

  [![enter image description here]()](/img/712b235fd3ac936721212f1cbf9fe2c5.png)

  **Пример 2:**

  Строка для кодирования: "abcd" Length = 4, она не кратна 3. Поэтому, чтобы сделать длину строки кратной 3, мы должны добавить 2-битовое заполнение, чтобы length = 6. Бит заполнения представлен знаком "=".

  Следует отметить: один бит дополнения равен двум нулям 00, поэтому два бита дополнения равны четырем нулям 0000.

  Итак, давайте начнем процесс: -

  1) Конвертировать каждый символ в десятичную.

  а = 97, б = 98, с = 99, д = 100

  2) Измените каждое десятичное на 8-битное двоичное представление.

  97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100

  3) Отдельно в группе 6 бит.

  011000, 010110, 001001, 100011, 011001, 00

  поэтому последний 6-бит не является полным, поэтому мы вставляем два дополнительных бита, равных четырем нулям "0000".

  011000, 010110, 001001, 100011, 011001, 000000 ==

  Теперь оно равное. Два знака равенства в конце показывают, что были добавлены 4 нуля (помогает при декодировании).

  4) Рассчитать двоичные числа в десятичные.

  011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==

  5) Преобразование десятичных символов в base64 с использованием диаграммы base64.

  24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==

  "abcd" => "YWJjZA =="