Как перевести Base64 в Base32
- Вставьте Base64 в поле Ввод · Base64. URL-safe символы (
-,_), отсутствующее дополнение и переносы строк не мешают. - Результат появится в поле Результат · Base32 (RFC 4648).
- Для ссылки
otpauth://или приложения-аутентификатора снимите галочку Дополнение (=) под результатом. - Нажмите Скопировать результат. Кнопка Base32 (RFC 4648) → Base64 в переключателе направления конвертирует в обратную сторону, как и страница Base32 в Base64.
Сами байты не меняются: ключ на 20 байт остаётся ключом на 20 байт, и это видно по счётчику Байты под инструментом.
Примеры
| Base64 | Base32 | Байты |
|---|---|---|
iEwO+V01Llzjb4MxBUtgEuCNW8o= | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20 |
iEwO-V01Llzjb4MxBUtgEuCNW8o | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20, URL-safe ввод без дополнения |
MTIzNDU2Nzg5MDEyMzQ1Njc4OTA= | GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | 20, тестовый секрет из RFC 6238 |
SGVsbG8h3q2+7w== | JBSWY3DPEHPK3PXP | 10 |
Base64 и Base32 в первых строках таблицы совсем не похожи друг на друга, и так и должно быть: Base64 кодирует 6 бит на символ, а Base32 – 5, так что символы никогда не совпадают по позициям.
Главная ошибка здесь: закодировать символы Base64 как текст. Если вставить iEwO+V01Llzjb4MxBUtgEuCNW8o= в кодировщик «текст в Base32», получится NFCXOTZLKYYDCTDM…, корректный Base32 для строки из 28 символов, но не ваш ключ. Коды аутентификатора с ним никогда не совпадут с серверными.
Настройка TOTP из секрета в Base64
Серверный код часто хранит общий секрет в Base64 или генерирует его командой вроде этой:
openssl rand -base64 20
Чтобы добавить его в приложение-аутентификатор, переведите секрет здесь и соберите ключевой URI:
otpauth://totp/Example:alice@example.com?secret=RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K&issuer=Example
algorithm, digits и period можно добавить параметрами; без них приложения считают, что это SHA-1, 6 цифр и 30 секунд. Превратите ссылку в QR-код любым локальным инструментом или дайте пользователю набрать секрет Base32 вручную. В секрете те же байты, которые сервер передаёт в HMAC, поэтому коды совпадут без изменений на сервере.
Если нужен новый секрет, а не существующий, сгенерируйте 20 случайных байтов в Base64 генератором случайного Base64 (пресет «Свой вариант») и переведите их здесь.
Длина для типичных размеров ключа
| Ключ | Base64 | Base32 без дополнения | Base32 с = |
|---|---|---|---|
| 10 байт (80 бит) | 16 | 16 | 16 |
| 16 байт (128 бит) | 24 | 26 | 32 |
| 20 байт (160 бит) | 28 | 32 | 32 |
| 32 байта (256 бит) | 44 | 52 | 56 |
Размеры, кратные 5 байтам, например 10 и 20, дают Base32 вообще без дополнения.
То же преобразование в Python
import base64
secret_b64 = "iEwO+V01Llzjb4MxBUtgEuCNW8o="
base64.b32encode(base64.b64decode(secret_b64)).decode().rstrip("=")
# 'RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K'
Для URL-safe ввода используйте base64.urlsafe_b64decode и сначала верните дополнение =, если его срезали. Подробнее об этом в статье Base64 в Python.
Вопросы и ответы
Почему приложениям-аутентификаторам нужен Base32, а не Base64?
Формат ключевого URI otpauth://, который приложения читают из QR-кодов, определяет секрет как Base32. Кроме того, его должно быть легко набрать вручную, если QR-код не сканируется, а в Base32 нет +, / и смешанного регистра, в которых легко ошибиться.
Нужно ли дополнение = в секрете Base32?
В ссылке otpauth:// не нужно: по формату ключевого URI дополнение опускают. Снимите галочку Дополнение (=). Впрочем, секрет на 20 байт занимает 32 символа, и дополнения у него нет в любом случае.
Какой длины должен быть секрет TOTP?
RFC 4226 требует не меньше 128 бит и рекомендует 160 бит, то есть 20 байт: 28 символов Base64 или 32 символа Base32.
Не опасно ли переводить секрет в Base32?
Кодирование не добавляет защиты и не убирает её: любой, у кого есть строка в любом из двух видов, может генерировать ваши коды. Риск в том, куда вы её вставляете. Эта страница конвертирует секрет в браузере, а её политика безопасности контента (CSP) блокирует сетевые запросы, кроме счётчика просмотров Cloudflare.