HOTP — различия между версиями
Andrey (обсуждение | вклад) |
Andrey (обсуждение | вклад) |
||
Строка 49: | Строка 49: | ||
===Как работает Truncate (обрезка)=== | ===Как работает Truncate (обрезка)=== | ||
− | Результат HMAC-SHA-1 — 160 бит или строка, состоящая из 20 байт | + | Результат HMAC-SHA-1 — 160 бит или строка, состоящая из 20 байт, на основе чего генерируется строка в 4 байта. Это происходит следующим образом: |
20-байтная строка представляется как 20 блоков по 8 бит, 4 младших бита последней 20-ой 8-битной последовательности определяют смещение (понятно, что это значение находится в диапазоне от 0 до 15). Далее выполняется конкатенация (склеивание) 4 последовательностей, первая из которых является строковым предобразованием вычисленного смещения, а вторая — преобразованием от смещения увеличенного на единицу и т.д. последние 31 бита этой склейки и будут теми 4 байтами. | 20-байтная строка представляется как 20 блоков по 8 бит, 4 младших бита последней 20-ой 8-битной последовательности определяют смещение (понятно, что это значение находится в диапазоне от 0 до 15). Далее выполняется конкатенация (склеивание) 4 последовательностей, первая из которых является строковым предобразованием вычисленного смещения, а вторая — преобразованием от смещения увеличенного на единицу и т.д. последние 31 бита этой склейки и будут теми 4 байтами. | ||
Далее 4 байта представляются как десятичное число, которое делится по модулю на 10^Digit. Результат и есть одноразовый пароль | Далее 4 байта представляются как десятичное число, которое делится по модулю на 10^Digit. Результат и есть одноразовый пароль |
Версия 10:34, 3 мая 2012
Содержание
HOTP: общее описание
HOTP — OATH-алгоритм генерации одноразовых паролей по событию (event-base) описан как RFC 4226. Как сказано выше в качестве параметра, отвечающего за динамику, используется событие, то есть сам факт генерации одноразового пароля: каждый раз при нажатии на кнопку генерации, счетчик событий увеличивает свое значение на единицу и именно это значение динамическое значение используется как основной параметр при расчете одноразового пароля.
Вторым параметром, используемым при расчете одноразового пароля, является симметричный ключ (symmetric key), который должен быть уникальным для каждого генератора и существует требование на его минимальную длину – 128 бит. Канонически, именно это значение определяет уникальность генератора одноразовых паролей. При этом стоит отметить, что дополнительный уровень энтропии вносится за счет случайного значения начального состояния счётчика событии, который вместе с симметричным ключом «прошивается в генератор и записывается в конфигурационный файл (по OATH-рекомендациям это должен быть формат PSKC, описанный в RFC 6030).
О чем думали создатели алгоритма
Основной задачей стандартизации алгоритма является повышение его применимости, и здесь речь идет столько с совместимости серверов аутентификации (проверки) и генераторов одноразовых паролей разных производителей, сколько заостряется внимание на простоте использования конечным пользователем и простоте реализации (дешевизне, низкой себестоимости аутентификатора — генератора одноразовых паролей). Это выражается в минимизации пользовательского интерфейса (чем меньше пользователь принимает участие в процессе, тем лучше) и возможности реализовать алгоритм, например, в SIM-карте (при этом возможность реализации на Java-карте являлось фундаментальным требованием)
Детализированные требования можно прочитать в RFC, здесь же приведем их короткие трактовки:
- Алгоритмы должен быть последовательность, то есть основываться на счетчике событий
- Должен быть экономичным с точки зрения вычислительных мощностей, энергопотребления, интерфейса взаимодействия с пользователем (минимизация количества кнопок и пр)
- Не должен требовать ввода каких-либо значений
- Простота восприятия пользователем: значение должно быть числовым с длиной минимум 6 цифр
- Простота ре-синхронизации счетчика событий
- Должен использовать надёжный общий секрет (shared secret) длина которого должна быть не менее 128 бит, а рекомендованная длина — 160 бит
Математическая подоплека
Общее
В основе генерации одноразовых паролей лежит HMAC-функция (RFC 2104), на вход которой подается два значения: симметричный ключ и текущее состояние счетчика. Отсюда, кстати, и название алгоритма HOTP — HMAC-Based One-Time Password. В качестве основы HMAC взят алгоритм SHA-1 (RFC 3174), то есть речь идет о HMAC-SHA-1 с длиной результата 160 бит.
Так как конечный пользователь будет испытывать катастрофические затруднения при наборе одноразового пароля длиной 160 бит, алгоритм предусматривает обрезку оригинального результата (160 бит) до приемлемой длины: одноразовый пароль имеет формат цифрового значения с длиной не менее 6 символов (цифр). Таким образом, функция генерации одноразового пароля по событию записывается следующим образом:
где:
К — симметричный ключ
С —текущее состояние счетчика
T — количество неверных аутентификаций прясле которых сервер заблокирует учетную запись пользователя
s — параметр рассинхронизации, определяет максимальное расхождение между счетчиком сервера и генератора (клиента в OATH-терминологии) при котором одноразовый пароль будет принят.
Digit — количество цифр в значении одноразового пароля
Truncate — функция обрезки, позволяющая преобразовать 160-битное значение функции HMAC-SHA-1, в упомянутый выше юзер-френдли числовой формат (с длиной 6 или более символов)
Как работает Truncate (обрезка)
Результат HMAC-SHA-1 — 160 бит или строка, состоящая из 20 байт, на основе чего генерируется строка в 4 байта. Это происходит следующим образом:
20-байтная строка представляется как 20 блоков по 8 бит, 4 младших бита последней 20-ой 8-битной последовательности определяют смещение (понятно, что это значение находится в диапазоне от 0 до 15). Далее выполняется конкатенация (склеивание) 4 последовательностей, первая из которых является строковым предобразованием вычисленного смещения, а вторая — преобразованием от смещения увеличенного на единицу и т.д. последние 31 бита этой склейки и будут теми 4 байтами.
Далее 4 байта представляются как десятичное число, которое делится по модулю на 10^Digit. Результат и есть одноразовый пароль