Для чого використовується базове кодування 64?


782

Я чув, як люди тут і там розмовляють про "кодування 64 бази". Для чого він використовується?


1
З посібника по base64_encode () : "Це кодування призначене для того, щоб перетворити бінарні дані на транспорт через транспортні шари, які не є 8-бітними чистими, наприклад, поштові тіла."
still_dreaming_1

Відповіді:


940

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

Тому, щоб обійти це, люди кодують бінарні дані в символи. Base64 - один з таких типів кодувань.

Чому 64?
Оскільки ви, як правило, можете розраховувати на ті самі 64 символи, які присутні у багатьох наборах символів, і ви можете бути впевнені, що ваші дані закінчуватимуться на другій стороні дроту.


104
(Теоретично ви можете зробити кодування base-80 чи щось подібне, але це було б значно важче. Повноваження двох - це природні бази для бінарних даних.)
Джон Скіт,

13
@yokees: Гарантії немає, вони просто символи, які майже завжди в безпеці. Ось чому існує декілька форм Base-64 ( en.wikipedia.org/wiki/Base-64 ).

8
Чи означає це, що всі передачі даних типу мереж повинні використовувати якесь кодування?
Таннер Саммерс

6
Але чому метод кодування base64 використовується для кодування рядкових даних? наприклад, у функції JavaScript atob Чи є сенс сервера кодувати файл json у формат base64? Спеціальні символи можуть бути випадком використання, але чому б не utf8 у такому випадку, вони є рівносильними? Будь-який подальший ресурс щодо цього буде дуже вдячний вам.
partizanos

4
Список принаймні деяких протоколів, які не змогли б мати, якщо хтось знає.
Тадей

202

Це в основному спосіб кодування довільних двійкових даних у тексті ASCII. Це займає 4 символи на 3 байти даних, плюс потенційно трохи прокладки в кінці.

По суті, кожен 6 біт вводу кодується алфавітом 64 символів. "Стандартний" алфавіт використовує AZ, az, 0-9 та + та /, з = як символ прокладки. Є варіанти, безпечні для URL-адрес.

Вікіпедія є досить хорошим джерелом додаткової інформації.


На такому мові, як php, чи будуть походить бінарні дані. Ми майже завжди працюємо з рядковими даними, якими є текст.
Cholthi Paul Ttiopic

3
@CholthiPaulTtiopic: результати шифрування чи стиснення, або звук / зображення / відео.
Джон Скіт

1
@CholthiPaulTtiopic: Боюся, я не маю поняття, що ви маєте на увазі під поняттям "що стосується місця зберігання", але на даний момент я думаю, що ми дещо поза темою.
Джон Скіт

2
@CholthiPaulTtiopic: Я настійно уникаю думати з точки зору "бінарного рядка". Бінарні дані повинні трактуватися як бінарні дані, а не розглядатися як текст. Я бачив буквально сотні - можливо, тисячі - питань щодо ПЗ, які в основному зводиться до людей, які недостатньо дбають про це розрізнення.
Джон Скіт

1
@ still_dreaming_1 PHP викликає їх binary strings. (джерело) php.net/manual/en/function.pack.php
Cholthi Paul Ttiopic

123

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

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


116

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

Але чому Base-64? Дві альтернативи перетворення двійкових даних у текст, які негайно з’являються на думку:

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

Base-64 відображає 3 байти (8 х 3 = 24 біта) в 4 символи, що охоплюють 6-біт (6 х 4 = 24 біта). Результат виглядає приблизно як "TWFuIGlzIGRpc3Rpb ...". Тому здуття живота лише в 4/3 = 1,33333333 рази від початкового.


10
Чи правильно я розумію, що 64 - найкращий вибір, оскільки це найвища потужність двох, яка може бути конвертована в друкований символ ASCII (їх 95)?
voho

Якщо в обох випадках вони 24 біта, то чи не здуття живота 1: 1? Або якщо ви говорите 4 символи, що охоплюють 6 біт, ви маєте на увазі, що насправді є 8 біт на char, але перші два мають 0s?
Девід Клемффнер

1
@Backwards_Dave Кожні 6 біт виражаються у 8 біт. Так здуття живота становить 8: 6, або 4: 3.
Атес Горал

82

Крім того, що вже було сказано, є два дуже поширених використання, які не були перераховані

Хеші:

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

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

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

Зауважте, що хоча Base64 часто використовується в криптографії, це не механізм захисту. Будь-який може перетворити рядок Base64 назад у початкові байти, тому його не слід використовувати як засіб захисту даних, а лише як формат для легшого відображення чи зберігання необроблених байтів.

Сертифікати

Сертифікати x509 у форматі PEM є кодованими базовою 64. http://how2ssl.com/articles/working_with_pem_files/


4
Насправді простіше, обробляючи, байти зберігати у байтах у багатьох випадках. Навіть у базі даних, а особливо у файлі (якщо використовуються записи фіксованої довжини або байти є єдиним вмістом). Base64 зазвичай використовується, коли ці байти призначені для передачі кудись, особливо через канал, який може відключити біти або інтерпретувати деякі байти як контрольні коди.
cHao

Я ніколи не бачив хеш, написаний як неподписані 8-бітові цілі числа, 0,1255,36 ... і відображення його за допомогою UTF-8 або будь-якого іншого кодування не має сенсу, як інакше ви відображали б його, окрім base64? Ключі шифрування та зашифровані дані часто зберігаються у конфігураційних та XML-файлах, де ви не можете зберігати необроблені байти. Я погоджуюся, якщо ви можете зберігати його як необроблений байт, то будь-якими способами, але base64 - це для тих ситуацій, коли ви не можете. Існує багато застосувань base64 поза передачею. Це просто два загальних сценарію, де ви це побачите.
Деспертар

1
Ви будете відображати хеш як шістнадцятковий, а не десятковий. Для хешей це насправді набагато частіше, ніж base64.
cHao

@cHao Так, це теж часто. Шістнадцяткові цифри можуть представляти будь-які двійкові дані, але база 64 має перевагу, займаючи набагато менше місця, оскільки вона використовує більше символів.
Деспертар

45

Роки тому, коли була запроваджена функція розсилки, на основі якої був текст повністю, з часом пройшов необхідність вкладень, таких як зображення та медіа (аудіо, відео тощо). Коли ці вкладені файли надсилаються через Інтернет (що, як правило, у формі двійкових даних), ймовірність пошкодження бінарних даних є високою у своєму сирому вигляді. Отже, для вирішення цієї проблеми підійшов BASE64.

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

Наприклад :

У C і C ++ цей символ "null" показує кінець рядка. Отже, "HELLO" зберігається так:

ЗДРАВСТВУЙТЕ

72 69 76 76 79 00

00 говорить "зупинись тут".

Тепер давайте заглибимось у те, як працює кодування BASE64.

Слід зазначити, що довжина рядка повинна бути кратною 3.

Приклад 1:

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

1) Перетворіть кожен символ у десятковий.

a = 97, c = 99, e = 101

введіть тут опис зображення

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

"Туз" => "YWNl"

введіть тут опис зображення

Приклад 2:

Рядок для кодування: "abcd" Довжина = 4, це не кратно 3. Отже, щоб довжина рядка була кратною 3, ми повинні додати 2-х бітну накладку, щоб зробити довжину = 6. Біт оббивки представлений знаком "=".

Слід зазначити: Один біт оббивки дорівнює двом нулям 00, тому два біт оббивки дорівнює чотирьом нулям 0000.

Тож давайте розпочнемо процес: -

1) Перетворіть кожен символ у десятковий.

a = 97, b = 98, c = 99, d = 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 =="


5
це дійсно чудове пояснення
maheshmnj

28

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

Отже, 0x01 буде перенесено як 0x81; 0x02 буде 0x82; 0x03 залишиться 0x03 і т.д.

Для подальшої використання цієї системи, коли визначено набір символів ASCII, було призначено лише 00-7F символів. (Досі всі символи, встановлені в діапазоні 80-FF, є нестандартними)

Багато маршрутизаторів дня ставлять перевірку парності та переклад байтів на апаратне забезпечення, змушуючи приєднані до них комп'ютери чітко працювати з 7-бітовими даними. Це змушує вкладення електронної пошти (та всі інші дані, через що протоколи HTTP та SMTP є текстовими), щоб їх перетворити у текстовий формат.

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


2
Це відмінна точка обговорення та цікавий урок історії, дякую.
Ден Бешард

26

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

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

Base64 можна використовувати в різних контекстах:

  • Еволюція та Thunderbird використовують Base64 для придушення паролів електронної пошти [1]
  • Base64 може використовуватися для передачі та зберігання тексту, який інакше може спричинити зіткнення роздільника
  • Base64 часто використовується як швидкий, але небезпечний ярлик для незрозумілих таємниць, не несучи накладних витрат на керування криптографічними ключами

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

  • Base64 використовується для кодування рядків символів у файлах LDIF
  • Base64 іноді використовується для вбудовування бінарних даних у XML-файл, використовуючи синтаксис, схожий на ......, наприклад, закладки Firefox.html.
  • Base64 також використовується під час спілкування з урядовими друкованими пристроями фіскального підпису (як правило, через послідовний або паралельний порти), щоб мінімізувати затримку при передачі символів квитанції для підписання.
  • Base64 використовується для кодування бінарних файлів, таких як зображення в скриптах, щоб уникнути, залежно від зовнішніх файлів.
  • Можна використовувати для вбудовування необроблених даних зображень у властивість CSS, наприклад фонове зображення.

11

Деякі протоколи транспортування дозволяють передавати лише буквено-цифрові символи. Уявіть собі ситуацію, коли символи управління використовуються для запуску спеціальних дій та / або підтримують лише обмежену ширину бітів на один символ. Base64 перетворює будь-який вхід у кодування, яке використовує лише буквено-цифрові символи +, /та =символи як прокладки.


8

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

Я потрапив у проблеми, коли виявив, що utf8 MySQL не підтримує 4-байтні символи unicode, оскільки він використовує 3-байтну версію utf8. Отже, що я зробив, щоб підтримувати повний 4-байтовий Unicode над utf8 MySQL? Ну, base64 кодують рядки під час зберігання в базі даних та base64 декодують при пошуку.

Оскільки базове кодування та декодування дуже швидко, вищезгадане спрацювало чудово.

Ви можете взяти до відома такі моменти:

  • Кодування Base64 використовує на 33% більше пам’яті

  • Рядки, що зберігаються в базі даних, не можуть бути зрозумілими для людини (Ви можете продати це як функцію, що рядки бази даних використовують основну форму шифрування).

Ви можете використовувати вищезазначений метод для будь-якого механізму зберігання даних, який не підтримує unicode.


6
"Ви можете продати це як функцію, в якій рядки бази даних використовують основну форму шифрування" Мені подобається ваш стиль: D
Еркан

7
"Ви можете продати це як функцію, що рядки бази даних використовують основну форму шифрування", що жахливо сказати: D
Алекс

1
основна форма шифрування проти всіх, хто не має алгоритму декодування base64 rofl: D
Eladian

1
@ Алекс - Це зовсім не "жахлива річ". Дані, що чутливі до другого ступеня, добре бути закодованими base64, щоб зробити їх нечитабельними адміністраторами db. Не завжди потрібно мати найвищий рівень шифрування для кожної частини даних. Наприклад, якщо ви хочете приховати "коментарі" від адміністратора db, тоді для роботи підійде base64. Грацій!
Василь Муса

1
Варто зазначити, що в MySQL зараз є підтримка всіх Unicode, хоча для цілей зворотної сумісності їх utf8тип все ще є лише трибайт; якщо ви хочете справжньої речі, використовуйте utf8mb4. Гарний злом, але більше не потрібен.
TRiG

7

Він використовується для перетворення довільних двійкових даних у текст ASCII.

Наприклад, вкладення електронної пошти надсилаються таким чином.


7

Я використовую це в практичному сенсі, коли ми передаємо великі бінарні об'єкти (зображення) через веб-сервіси. Отже, коли я тестую веб-службу C # за допомогою сценарію python, бінарний об’єкт можна відтворити за допомогою невеликої магії.

[У пітоні]

import base64
imageAsBytes = base64.b64decode( dataFromWS )

1
Чи швидше подорожують дані?
FelipeM

6

"Схеми кодування Base64 зазвичай використовуються, коли є необхідність кодування двійкових даних, які потрібно зберігати та передавати через носії, призначені для обробки текстових даних. Це для того, щоб дані залишалися цілими без змін під час транспортування »(Wiki, 2017)

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

Інший приклад :: uenc = URL кодовані = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel-kayano-xii.html .

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

Повний приклад може бути: “ http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 /


4

Здебільшого я бачив, як це використовувалося для кодування бінарних даних у контекстах, які можуть обробляти лише набори ascii - або прості - символи.


3

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


2

База64

Base64 - це загальний термін для ряду подібних схем кодування, які кодують двійкові дані, обробляючи їх чисельно і переводячи їх у базове 64 представлення. Термін Base64 походить від конкретного кодування передачі вмісту MIME.

Схеми кодування Base64 зазвичай використовуються, коли виникає потреба в кодуванні бінарних даних, які потрібно зберігати та передавати через носії, призначені для обробки текстових даних. Це потрібно для того, щоб дані залишалися цілими без змін під час транспортування. Base64 зазвичай використовується в ряді програм, включаючи електронну пошту через MIME та зберігання складних даних у XML.


0

Base64 можна використовувати для багатьох цілей.

Основна причина - перетворення двійкових даних у щось прохідне.

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

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



2
Ви інтерпретуючи визначення «шифрування» далеко надто буквально. Слово перетворилося в щось справедливе трохи конкретніше, ніж його походження.
Дан Бешард

0

Одна шістнадцяткова цифра має один накид (4 біти). Дві грибки складають 8 біт, які також називаються 1 байтом.

MD5 генерує 128-бітний вихід, який представлений за допомогою послідовності з 32 шістнадцяткових цифр, що в свою чергу є 32 * 4 = 128 біт. 128 біт становлять 16 байт (оскільки 1 байт - 8 біт).

Кожен символ Base64 кодує 6 біт (за винятком останнього символу без колодки, який може кодувати 2, 4 або 6 біт; і остаточних символів колодки, якщо такі є). Отже, для кодування Base64, 128-бітовий хеш вимагає принаймні ⌈128 / 6⌉ = 22 символи, плюс колодка, якщо така є.

Використовуючи base64, ми можемо зробити кодований вихід потрібної довжини (6, 8 або 10). Якщо ми вирішимо вирішити 8 char довгий вихід, він займає лише 8 байт, тоді як він займав 16 байт для 128-бітного хеш-виводу.

Отже, крім безпеки, кодування base64 також використовується для зменшення споживаного місця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.