Одноразовый пароль
- 1 year ago
- 0
- 0
HOTP ( англ. HMAC-Based One-Time Password Algorithm ) — алгоритм защищённой аутентификации с использованием одноразового пароля (One Time Password, OTP). Основан на HMAC (SHA-1). Является алгоритмом односторонней аутентификации, а именно: сервер производит аутентификацию клиента .
В качестве параметра, отвечающего за динамику генерации паролей, используется событие, то есть сам факт генерации : каждый раз при создании нового пароля счётчик событий увеличивает своё значение на единицу, и именно это монотонное возрастающее значение используется как основной параметр алгоритма. Вторым параметром для расчёта одноразовых паролей является симметричный ключ, который должен быть уникальным для каждого генератора (клиента) и закрытым от всех, кроме сервера и самого генератора (клиента).
Алгоритм впервые формально описан командой IETF в декабре 2005. Он стал первым реально успешным проектом Initiative for Open Authentication ( ). Алгоритмы генерации одноразовых паролей получили в это время широкую популярность в связи с резким развитием мобильной индустрии. Требовался надёжный алгоритм, простой в плане реализации.
В 2008 году HOTP подарил жизнь более сильному алгоритму Time-based One-time Password Algorithm (TOTP), который во многом наследует черты родителя. В сентябре 2010 на основе TOTP был разработан мощный алгоритм аутентификации OATH Challenge-Response Algorithm ( OCRA ).
Алгоритм HOTP также внёс инновации в технологию генерации одноразовых паролей. Стойкая по тем временам хеш-функция SHA-1 сочеталась с нетривиальным решением наличия счётчика событий. Эти черты подняли HOTP на один уровень с такими проверенными временем алгоритмами, как S/KEY .
Основным отличием между двумя алгоритмами является генерация пароля на основе метки времени, которую использует в качестве параметра TOTP -алгоритм. При этом используется не точное значение времени, а текущий интервал, границы которого были установлены заранее (например, 30 секунд)
HOTP генерирует ключ на основе разделяемого секрета и не зависящего от времени счётчика. Модель этого алгоритма основана на событиях — например, каждый раз, когда генерируется очередной одноразовый пароль, счётчик будет увеличиваться. Следовательно, сгенерированные впоследствии пароли должны быть разными каждый раз.
Благодаря этому основа для счётчика в HOTP алгоритме, в отличие от других алгоритмов, использующих таймер, защищена от рассинхронизации передающих устройств или слишком большого расстояния между ними (такого расстояния, что ответ от получателя приходит позже, чем истечёт время валидности пароля) . Это позволяет HOTP-паролям оставаться действительными в течение неограниченного количества времени, в то время как TOTP -пароли перестанут быть действительными спустя конкретный промежуток времени.
В итоге, при условии использования той же самой хеш-функции, как и в HOTP, данное отличие в работе алгоритма делает TOTP более безопасным и предпочтительным решением для одноразовых паролей
Алгоритм должен возвращать не меньше 6 цифр для обеспечения достаточной безопасности пароля. В зависимости от уровня требований к защите, можно использовать значения для HOTP, состоящие из большего количества цифр, для получения более стойкого к атакам пароля. Работу алгоритма можно описать следующей формулой :
Данный пример демонстрирует работу алгоритма, генерирующего шестизначный числовой пароль из кода аутентификации размером в 160 бит. Пусть на определённом шаге было вычислено значение строки из
int offset = hmac_result[19] & 0xf;
int bin_code = (hmac_result[offset] & 0x7f) << 24
| (hmac_result[offset+1] & 0xff) << 16
| (hmac_result[offset+2] & 0xff) << 8
| (hmac_result[offset+3] & 0xff);
Тогда результат будет выглядеть следующим образом:
Индекс байта | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
Значение | 1f | 86 | 98 | 69 | 0e | 02 | ca | 16 | 61 | 85 | 50 | ef | 7f | 19 | da | 8e | 94 | 5b | 55 | 5a |
При создании нового одноразового пароля генератором (клиентом) значение счётчика клиента увеличивается на единицу. В дальнейшем значение счётчика подаётся на вход хеш-функции вместе с ключом . После этого будет отправлено серверу аутентификации, где оно будет сравнено со значением, вычисленным сервером. Если значения совпадают с учётом расхождения не больше параметра рассинхронизации , то сервер увеличивает на единицу значение своего счётчика. Если данные не совпали, то сервер начинает ресинхронизацию и повторяет её в случае неудачи, пока не будет достигнут предел неудачных попыток аутентификации . После этого сервер блокирует учётную запись пользователя .
Как было упомянуто ранее, клиент обновляет значение счётчика событий при каждой генерации одноразового пароля. В свою же очередь, значение счётчика на сервере увеличивается только после успешной аутентификации. Исходя из этих утверждений можно описать причины, почему внедрение процесса ресинхронизации необходимо:
Это приводит к необходимости использования параметра рассинхронизации , который будет отвечать за размеры окна, в пределах которого значения счётчика клиента и сервера будут считаться синхронизированными.
Ресинхронизация проводится исключительно сервером. Она заключается в расчёте нового значения для своего счётчика событий, чтобы его значение совпадало с полученным от клиента в пределах разницы между значениями не более . Если это условие выполняется, то сервер обновляет значение собственного счётчика .
В противном случае сервер рассчитывает заново состояние счётчика. В ходе этого процесса сервер может запросить несколько раз дополнительные значения одноразовых паролей. Это сделано для повышения уровня безопасности, так как сравнения паролей в этом случае выполняются для двух или трёх пар. Если предел попыток будет исчерпан, то сервер заблокирует учётную запись пользователя. Параметр также определяет окно, в пределах которого сервер увеличивает счётчик в процессе ресинхронизации. Это ограничение параметром служит для:
Системы защиты, построенные с использованием HOTP, обладают высокой степенью надёжности. Они, в большинстве своём, устойчивы к широко распространённым криптографическим атакам, например:
Часто злоумышленнику удаётся украсть с сервера аутентификации хешированный пользовательский пароль, по которому происходит проверка подлинности. Однако алгоритм для создания пароля использует также счётчик событий. Поскольку начальное значение счётчика выбирается сервером, оно обычно случайное, что затрудняет взлом канала связи даже при наличии у атакующего разделяемого секрета.
Данные изменения не являются обязательными или рекомендованными авторами алгоритма расширениями. Однако для повышения уровня безопасности собственной реализации можно применить следующие варианты :
Извлечение каждого нового символа из результата резко уменьшает шансы успешной атаки. Благодаря этому можно сделать процесс работы с паролями удобнее. Например, увеличить количество попыток ввода или расширить диапазон, в котором сравниваются значения счётчиков сервера и клиента.
Смысл этой идеи заключается в том, чтобы использовать не только цифры для пароля, но ещё и символы A-Z. Вернее, речь идёт о наборе из 32 символов из алфавитно-цифрового множества. Сразу же становится видно, как вырос уровень безопасности паролей, потому что теперь вероятность успеха полного перебора составляет для паролей, состоящих из 6 символов.
Если условия позволяют клиенту отправлять не только значение HOTP, но и другие данные, то можно сделать процесс ресинхронизации гораздо удобнее и безопаснее, если вместе со значением HOTP клиент будет отправлять серверу состояние счётчика событий. В этом случае значение клиентского HOTP будет выступать в роли имитовставки для состояния счётчика.
Проверяя таким образом значения счётчика на подлинность и соответствие, можно отказаться от использования параметра рассинхронизации, что позволит также повысить уровень защиты алгоритма, потому что в обновлённой системе вероятность успеха атаки прямым перебором будет составлять всего .
Объединение , стандартизовав HOTP, не давало никаких указаний по поводу реализации алгоритма. Напротив, свобода разработчиков позволяет находить все новые решения, стремясь удовлетворить потребности заказчика и внести инновационный вклад в технологию OTP.
Распространенную реализацию HOTP на Java можно найти в пакете org.jboss.security.otp, который входит в стандартные библиотеки свободно распространяемого веб-сервера Apache Jboss.
Ещё одна реализация на языке Java представлена непосредственно объединением OATH в пакете org.openauthentication.otp.
Можно также упомянуть реализацию — проект OATH Toolkit, библиотека liboath которого позволяет создавать пароли в режиме HOTP и TOTP.
Большое количество низкоинтеллектуальных устройств специально создано для генерации паролей или передачи данных с помощью HOTP и TOTP (Feitian, SecuTech, SmartDisplayer, Vasco, Yubico, ). Алгоритм также используется в домашних сетях для управления периферией с помощью пульта дистанционного управления или мобильного телефона.
HOTP основан на SHA-1 , которая более не считается достаточно устойчивой к коллизиям. Однако, алгоритм HOTP использует только факт случайности числа, посчитанного на её основе, поэтому наличие коллизий непосредственно не влияет на его работу.
Односторонняя аутентификация подразумевает, что клиент по потребности пытается установить связь. После чего сервер отправляет запрос обратно клиенту и проверяет его ответ на подлинность. Модификация алгоритма OCRA позволяет также и пользователю провести аутентификацию сервера.