Base64 — это способ представления бинарных данных в виде ASCII-строки. Он используется там, где требуется передавать или хранить произвольные байты в текстовой форме: в HTTP-заголовках, XML, JSON, JWT, электронных письмах.
Принцип основан на разбиении входных данных на группы по 3 байта (24 бита). Далее эти 24 бита делятся на 4 группы по 6 бит. Каждая 6-битная группа кодируется символом из таблицы Base64 (64 возможных символа).
Алфавит Base64:
Если количество байт не кратно 3, используется символ заполнения
=.
Пример логики:
===Padding нужен только для выравнивания длины до кратности 4.
Base64url — это вариант Base64, адаптированный для использования в URL и HTTP-параметрах.
Основные отличия:
+ заменяется на -/ заменяется на _= (padding) часто удаляетсяПричина появления Base64url — конфликт символов + и
/ с URL-энкодингом. В URL эти символы могут
интерпретироваться специальным образом, поэтому был создан безопасный
вариант.
Сравнение:
| Base64 | Base64url |
|---|---|
| A+/9 | A-_9 |
| + / | - _ |
| = | (обычно убирается) |
Символ = в Base64 выполняет исключительно выравнивающую
функцию. Он не несёт данных.
В Base64url часто padding удаляют полностью, но это создаёт важный нюанс:
Формула восстановления padding:
если длина % 4 = 2 → добавить "=="
если длина % 4 = 3 → добавить "="
если длина % 4 = 0 → ничего не добавлять
Библиотека Jsrsasign предоставляет набор утилит для кодирования и
декодирования в модуле KJUR.crypto.Util.
Основные методы:
hextob64(hex) — HEX → Base64b64tohex(b64) — Base64 → HEXhextob64u(hex) — HEX → Base64urlb64utohex(b64u) — Base64url → HEXТакже часто используются вспомогательные функции:
KJUR.crypto.Util.utf8tob64u(str)KJUR.crypto.Util.b64utoutf8(b64u)const hex = "48656c6c6f"; // "Hello"
const b64 = KJUR.crypto.Util.hextob64(hex);
const b64url = KJUR.crypto.Util.hextob64u(hex);
console.log(b64);
console.log(b64url);
Jsrsasign не всегда предоставляет прямую конвертацию Base64 → Base64url как отдельную функцию, но преобразование выполняется заменой символов:
function base64ToBase64url(b64) {
return b64
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=+$/, "");
}
Обратное преобразование требует восстановления символов и padding:
function base64urlToBase64(b64url) {
let b64 = b64url
.replace(/-/g, "+")
.replace(/_/g, "/");
while (b64.length % 4 !== 0) {
b64 += "=";
}
return b64;
}
Jsrsasign предоставляет готовую функцию:
const hex = KJUR.crypto.Util.b64utohex("SGVsbG8");
console.log(hex);
Если строка без padding:
const hex = KJUR.crypto.Util.b64utohex("SGVsbG8"); // работает без "="
Частая задача — преобразование текста в безопасный формат:
const text = "Привет";
const b64url = KJUR.crypto.Util.utf8tob64u(text);
console.log(b64url);
Обратное преобразование:
const decoded = KJUR.crypto.Util.b64utoutf8(b64url);
console.log(decoded);
JSON Web Token (JWT) использует исключительно Base64url.
Структура JWT:
header.payload.signature
Каждая часть:
Пример:
const header = {
alg: "HS256",
typ: "JWT"
};
const payload = {
sub: "1234567890",
name: "John",
iat: 1516239022
};
const sHeader = KJUR.jws.JWS.readSafeJSONString(JSON.stringify(header));
const sPayload = KJUR.jws.JWS.readSafeJSONString(JSON.stringify(payload));
Внутри Jsrsasign кодирование происходит через Base64url автоматически, но понимание механизма важно при ручной сборке токенов.
1. Игнорирование padding
Некоторые декодеры требуют строгую длину:
// ошибка
b64utohex("SGVsbG8")
// может потребоваться
b64utohex("SGVsbG8=")
2. Использование Base64 вместо Base64url в JWT
JWT может ломаться из-за символов + и
/.
3. Двойное кодирование
Частая ошибка:
btoa(btoa(str)) // неверно
4. Несоответствие UTF-8 и Latin1
Jsrsasign ожидает корректную UTF-8 обработку:
KJUR.crypto.Util.utf8tob64u("текст") // корректно
В браузере есть btoa и atob, но они:
В Node.js используются Buffer:
Buffer.from(str).toString("base64")
Buffer.from(str).toString("base64url")
Jsrsasign унифицирует эти различия через собственные функции.
Base64url — это не отдельный стандарт кодирования, а соглашение поверх Base64.
Поэтому:
HEX:
hex → hextob64 → Base64
hex → hextob64u → Base64url
STRING:
utf8 → utf8tob64u → Base64url
Base64url → b64utoutf8 → UTF-8
В криптографических протоколах Base64url используется почти всегда, потому что:
Base64 остаётся актуальным только для: