Розробники · Base64 енкодер & decoder
Base64 проти base64url: чому стандартний декодер відхиляє - і
· Як працює
Опубліковано ToolAcre · Редакція журналу
бази64 коди розробник-workflow

base64url swaps + і / для - і так що вихід може подорожувати в URL-адресах і назвах файлів без насадки. Цей пост пояснює два алфавіти, як перетворити між ними і чому набивається занадто.
Токен, який декодує всюди, крім коду — недійсна помилка, викликана однією - або
Р JWT сегмент не вдається декодувати в стандарті Base64 декодер з недійсним похибкою про помилку символів. Але візуально, не з'являється тиш. Шукайте ще раз. Версія base64url використовує - де стандарт Base64 використовує +, і де він використовує /. Багато декодери приймають тільки один алфавіт, і токен закодовано для URL захист буде відхилено від очікувань коду RFC 4648 Стандарт Баз64.
Два абетки еквівалентні; перетворення між ними є механічною заміною символів. Проблема виникає тому, що + і / мають значення в URL. Підпишіться на розсилку/x-www-form-urlencoded формувати дані. Передня щітка - це ступінчастий сепаратор URL. Якщо ви вбудовуєте Base64 безпосередньо в URL параметр запиту без %-encoding + і /, декодер може зловживати.
Чому + і / є проблемою у URL-адресах та файлах — зарезервоване значення / в шляхах і + як простір у вигляді даних
A + може бути прочитаний як простір до досягнення декодера. A / може розбити значення параметра на неправильному місці. RFC 4648 секція 5 визначає base64url алфавіт для усунення неоднорідності: використання - замість + і замість /, Таким чином, вихід є безпечним у URL-адресах та файлах. Два алфавіти ідентичні крім двох символів.
Standard Base64 використовує символи на позиціях 62 і 63: А–З0–25), а–з (26–51), 0–9 (52–61), + (62), / (63). base64url використовує A–Z (0–25), а–з (26–51), 0–9 (52–61), - (62), _ (63). Все інше—бітне перегрупування, правила наповнення, картування бітів на індекси String індексів для стандартного Base64 виготовить ряд показників для base64url; тільки характер на позиціях 62 і 63 буде відрізнятися.
Основа64url алфавіт від RFC 4648 секція 5 — два замінених персонажів і чому нічого іншого
Якщо вхід не містить індексів 62 або 63 (без + або / в стандарті, немає - або в base64url), обидва абетки виробляють ідентичні результати. Перетворення стандартної бази64 на base64url є прямимforward Find-and-replace: swap + для - і / для . Декодування base64url string в стандарті Base64 вимагає зворотного зв'язку: swap - для + і для /.
Перетворення є симетричним і завжди дієвим. Якщо ви зіткнулися з токеном, що не заперечує з недійсними помилками нагадування - або , перевірте, чи приймається декодер base64url. Якщо ні, застосуйте заміщення символів, і якщо вводять інші добре сформовані, декодування повинно бути успішним. Розглянемо синтетичні JWT сегмент головки `eyJhbGciOiJIUzI1NiJ9`: відновлення його дозволеного наповнювача UTF-8 врожайність `{"alg":"HS256"}`. Що таке значення алгоритму, як і раніше, контрольований вхід, не політика перевірки.
ToolAcre визначає, як вибір енкодера, а не затягуючи його на букмекер алфавіту. Що таке поділ корисної докази: URL-безпечний вихід може бути розбитий або ненападаний, в той час як нормалізується декодера або форма перед тим, як викликати примітив браузера. Альфабет і набивання пов'язані конвенції, не один перемикач.
Падінг в base64url необов'язково за умовчанням — чому JWTs omit = і як можна відновити його з довжини
При індексі 62, вихідний характер - 63, вихід . Ідентичні байти за допомогою стандартного алфавіту будуть виробляти + в індексі 62 та / в індексі 63. Перетворення base64url призводить до стандартної операції символів: сканування для - і заміна +, сканування для і замінити /, потім декодувати як звичайний.
Помітки, які ви відновлюєте, є ідентичними, тому що індекси були ідентичними; відрізняються тільки символи. Накладка в base64url є обов'язковою умовою, хоча стандартні дозволи. Компактний підписаний JWT має рівно три базові64url сегменти, що долучаються до точок; зашифровано п'ятичасте значення JWE і не така ж структура. Розщепити токени перед декодуванням, тому що точки відносяться до JWT послідовність, не або базовий алфавіт.
Заголовок і перевантаження повинні декодувати як суворий UTF-8 JSON об'єкти. Відрізок підпису зашифровані байти, а не третій JSON об'єкт; вимірювання його декодованої довжини байт може діагностувати форму, але не кількість байтів виправляє його. Перевірка все ще вимагає надійного ключа, незалежно дозволеного алгоритму та перевірки позовної заяви.
Працював приклад: перетворення JWT відрізок головки до стандарта Base64 — замінює символи, додаючи наповнювачі, розшифровуючи JSON
Декодер може відновити відсутні наповнювачі, розділивши довжину рядка на чотири, обчислення залишаються, додаток 0, 1або 2 рівними знаками. Якщо довжина рядка не відрізняється від чотирьох, відсутній накидка очевидна. Якщо довжина є декількома з чотирьох, рядок був або прокладений, потім обшивається смугою, або вхід вже кілька чотирьох байтів (закінчення трьох байтів в кінцевому блокі, що не потребує наповнювача).
Конкатенційна основа64url відрізків вимагає уваги на наповнювачі. Якщо три сегменти кожного кінця з =, конкатування безпосередньо виробляє рядки, такі як AAAA=BBBB=CCCC=, де набивається в середині, тепер промені персонажі, що не вирівнюють маркери. Саме тому JWTs omit набивається в кожному сегменті: трисекментна структура явна, тому декодування приступає самостійно на кожну частину, а в середині згортання стружка непотрібна і буде розбити парсінг.
Загальні помилки — змішування абеток в одному рядку, або %-відхиленому стандарті Base64 замість використання base64url
Якщо побудувати багатосекментне навантаження, вирішіть на об'єкті з начинкою: або в кожному сегменті, і ніколи не конкатенувати безпосередньо, або відмітити і відновити від довжини тільки при декодуванні. RFC 4648 стандарт - орган на обох алфавітах. Розсилка 4 specifies Standard Base64; секція 5 specifies base64url. Кожен конформуючий декодер має чітко статус, який абет приймає його.
Код приймає base64url, але не стандарт Base64 (або навпаки) реалізує тільки підмножину. Базовий64url алфавіт існує для сумісності з URL і обмеження на ім'я файла; це не поліпшення або заміна, просто варіант для конкретного контексту. Коли ви API або формат Token виберіть один алфавіт і документ, який один. Поширена помилка є процентним кодом Base64 замість використання base64url. Впровадження також пояснює межі статті. Нормалізує гіфен і андерсон перед декодуванням, але він невіряє підпису токени або письмових претензій. Перетворення JWT сегмент до байтів може виявити JSON; не можна встановити, хто видав JSON Чи змінився хтось.
Що це не обкладинка — перевірка JWT підписи, base32 та інші RFC 4648 кодування
%2B – відсоток коду +; %2F процентний код /. Захищаючи кодування перетворює TWFu в TWFu (не спеціальні символи) але TE9S+g== в TE9S%2Bg%3D%3D (до багатьох символів для обробки). Правильне рішення - використовувати base64url, яка виробляє URL-безпечний вихід вже. Захищаючи Base64 є надпотужним і відпрацьованим. Використовуйте правильний алфавіт для контексту. Базовий енкодер і декодер приймає одночасно абетки автоматично.
Якщо ви вставляєте рядок, що містить - він лікує його як base64url; якщо рядок паста містить +, він лікує його як стандарт Base64. Інструмент також приймає URL-адреси та лікує їх як URL-безпечний вхід. Практична перевірка, отже, має два незалежних результати: байти кругло-смуговий, а вибране уявлення підходить для його каналу. Передача першого говорить про трансформацію. Передача другого говорить про пунктуацію і начинку не буде повторюватися URL, ім'я файлу, cookie або протокол, що його виконує.
Відправлення: два алфавіти, одна трохи макета — як Base64 encoder & decoder ручки стандартного алфавіту в браузері, і де його сторінка інструментів говорить про те, що він приймає
При декодуванні JWT сегмент або URL-безпечний токен, ви можете вставляти безпосередньо без перетворення, і інструмент визначає алфавіт з контексту. Відхилити не вдалося декодування стає просто: паста токен, див. у випадку, якщо інструмент приймає його, і якщо ні, ручні символи та спробуйте знову.
Сама заміщення є одним рядком коду, але не вдалося декодувати також може прийти з неможливої довжини, переміщення насипання, корупція або не-Base64 вхід. Інструмент нормалізує як абетки автоматично, тому прийняття підтверджує тільки, що байти можуть бути відновлені. Декодований JWT Завантажити все-таки є невизначеною вимогою до окремого випрямлення перевіряє підпис та очікуваний алгоритм.