Base64URL кодирование и декодирование в PHP

Base64URL кодирование и декодирование в PHP

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

Отличия Base64URL от обычного Base64

  • Символы: вместо + и / в Base64URL используются - и _. Это сделано, чтобы строка была безопасна для использования в интернете (в адресах сайтов, например).
  • Знаки равенства =: в обычном Base64 они иногда появляются в конце для «выравнивания». В Base64URL их обычно убирают.

Из‑за этих небольших отличий, стандартный base64_decode в PHP не понимает Base64URL. Он ждёт «свои» символы и нужную длину.

Реализация Base64URL в PHP

Так как PHP не имеет встроенных функций для Base64URL, нужно написать собственные:

<?php

function base64UrlEncode(string $data): string {
    // Кодируем данные в стандартный Base64
    $base64 = base64_encode($data);

    // Подменяем символы + и /
    $base64Url = strtr($base64, '+/', '-_');

    // Убираем символы выравнивания "="
    return rtrim($base64Url, '=');
}

function base64UrlDecode(string $base64Url): string {
    // Подменяем обратно символы - и _
    $base64 = strtr($base64Url, '-_', '+/');

    // Добавляем выравнивающие "=" при необходимости
    $padding = strlen($base64) % 4;
    if ($padding) {
        $base64 .= str_repeat('=', 4 - $padding);
    }

    // Декодируем в обычную строку
    return base64_decode($base64);
}

// Пример использования
$text = '<<<?!?!?>>>';
$encoded = base64UrlEncode($text);
echo "Закодированная строка: $encoded".PHP_EOL;

$decoded = base64UrlDecode($encoded);
echo "Декодированная строка: $decoded".PHP_EOL;

Где используется Base64URL?

  • JWT (JSON Web Tokens) – токены авторизации состоят из трех частей (header, payload, signature), каждая из которых кодируется именно в Base64URL.
  • OAuth 2.0 – некоторые протоколы передачи ключей и кодов используют безопасное кодирование.
  • URL‑параметры – когда нужно передать двоичные данные (например, бинарный ID или хэш) прямо в строке запроса.
  • API – безопасная передача данных между сервисами.

Base64URL — это всего лишь «безопасная для URL» версия Base64. Встроенных функций в PHP нет, зато две небольшие функции решают задачу полностью.

Копирование материалов сайта возможно только с указанием ссылки на первоисточник.