Base62 против Base64: идентификаторы не являются произвольными потоками байтов.

Узнайте, почему порядок алфавита Base62 и правила с начальными нулями имеют значение и когда Base64URL является лучшим форматом обмена.

Base62 обычно использует цифры, а также буквы верхнего и нижнего регистра. Это делает его привлекательным для компактных идентификаторов без знаков препинания. Base64 использует 64 символа и напрямую упаковывает группы битов. Хотя имена похожи, реализации Base62 часто моделируют входные данные как число, что создает различные вопросы совместимости.

Порядок алфавита является частью формата.

Две библиотеки Base62 могут выбирать разные порядки цифр, прописных и строчных букв. Одна и та же видимая строка затем представляет разные числа. Система, использующая 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz не согласен с тем, что сначала ставятся строчные буквы. Запишите алфавит и тестовые векторы в протокол; Одного «Base62» недостаточно.

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

Сохранять длину при кодировании байтов

Рассмотрим два файла, содержащие шестнадцатеричные 01 и 0001. Интерпретируемые как целые числа без знака, оба имеют значение один. Простое преобразование целых чисел в Base62 теряет различие. Байт-ориентированный формат Base62 требует явной обработки начального нуля или поля длины. Это особенно актуально для случайных токенов и криптографических значений фиксированной длины.

const a = BigInt('0x01');
const b = BigInt('0x0001');
console.log(a === b); // true: numeric equality loses byte length

Выбирайте в зависимости от того, что означает значение

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

Кодирование — это не рандомизация. Последовательные целые числа остаются предсказуемыми после преобразования Base62. Если идентификаторам необходимо противостоять угадыванию, сгенерируйте достаточную непредсказуемую энтропию, используя криптографический случайный источник, а затем закодируйте полученные байты без потери длины. Не рассматривайте компактный на вид токен как доказательство безопасности его создания.

При сравнении выходных размеров включайте префиксы, правила заполнения и метаданные любой длины. Обратный проход по крайней мере пустого ввода, нулевого байта, нескольких ведущих нулей и байта с высоким значением. Алфавит Base64URL стандартизирован в RFC 4648; приложение Base62 должно само указать дополнительные сведения.