TOTP Base32 против Base64 - PullRequest
       30

TOTP Base32 против Base64

0 голосов
/ 29 апреля 2018

Каждая реализация TOTP (даже FreeOTP от RedHat), которую я нахожу, использует кодирование / декодирование Base32 для сгенерированного секрета. Почему он не использует Base64, поскольку Base32 использует примерно на 20% больше места, и его (главным образом) единственным преимуществом является то, что он лучше читается человеком? Это не показывается пользователю для генерации в любом случае.

Хотя каждый комментарий в реализации говорит о том, что его реализация следует RFC6238 / RFC4226 , я не могу найти ничего, что было сказано о base32 в документах RFC.

Очевидно, имеет смысл преобразовать его в Base32 или Base64 из-за безопасности данных при транспортировке, но почему бы тогда просто не использовать Base64?

Ответы [ 2 ]

0 голосов
/ 02 августа 2019

Причина, по которой используется base32, состоит в том, чтобы избежать человеческой ошибки. Не имеет ничего общего с пространством. Причина, по которой Base32 не упоминается в RFC4226, заключается в том, что он не имеет ничего общего с закрытым ключом, HMAC и генерацией токенов. Base32 используется только для доставки закрытого ключа в удобочитаемой форме человеку.

Подробнее, если интересно.

Закрытый ключ в TOTP должен быть 20-байтовым (160-битным) секретом. Закрытый ключ используется с HMAC-SHA1 для кодирования счетчика времени эпохи. Токен извлекается из сгенерированного 160-битного HMAC.

НО ввести этот секрет в такой инструмент, как Google Autheatator, нелегко. Хорошо, есть вариант QR-кода, который собирает этот закрытый ключ с веб-сайта. Но эта функция не всегда доступна.

Так что, когда вам нужно ввести этот закрытый ключ, это поделиться с пользователем в формате base32. т. е. ключ кодируется так, чтобы создать строку BASE32.

Так почему же BASE32 лучше, чем base64 в этом случае?

Одна важная и простая причина, и почему BASE32 вообще существует. Использует только прописные буквы A-Z (без строчных) и цифры 2-7. № 0189 26 + 6 символов = 32.

Нет строчных букв и 0189, поэтому ilI1 не перепутан. Есть только я. B и 8 0 и O путаница также устранена.

До такой степени, что если был введен 0, его можно рассматривать как O. A 1 как I и т. Д. Независимо от того, пытается ли инструмент выполнить автокоррекцию или мои предпочтения, просто укажите пользователю недействительную запись - дело вкуса. Но что ясно, человеческая ошибка неуникальной интерпретации строки значительно уменьшается. Это не относится к base64.
Все вышеперечисленные проблемы с перепутанными прописными и строчными буквами и числами относятся к base64.

0 голосов
/ 25 мая 2018

Я считаю, что это просто исторический контекст. Кто-то вначале выбрал Base32, инструмент стал популярным, и потомки используют ту же кодировку для соответствия.

Я также видел много реализаций, использующих шестнадцатеричный формат, и примеры в предоставленном RFC6238 также используют шестнадцатеричный формат.

...