HOTP
HOTP (англ. HMAC-Based One-Time Password Algorithm) — алгоритм захищеної аутентифікації з використанням одноразового пароля (One Time Password, OTP). Заснований на HMAC (SHA-1). Є алгоритмом односторонньої аутентифікації, а саме: сервер виконує аутентифікацію клієнта.
В якості параметра, що відповідає за динаміку генерації паролів, використовується подія, тобто сам факт генерації[1]: кожного разу при створенні нового пароля лічильник подій збільшує своє значення на одиницю, і саме це монотонне зростаюче значення використовується як основний параметр алгоритму. Другим параметром для розрахунку одноразових паролів є симетричний ключ, який повинен бути унікальним для кожного генератора (клієнта) і закритим від усіх, крім сервера і самого генератора (клієнта).
Історія
Алгоритм уперше формально описано командою IETF в грудні 2005.[2][3] Він став першим реально успішним проектом Initiative for Open Authentication (OATH).[4] Алгоритми генерації одноразових паролів отримали в цей час широку популярність у зв'язку з різким розвитком мобільної індустрії. Був необхідний надійний алгоритм, простий в плані реалізації.
У 2008 році HOTP подарував життя більш сильному алгоритмом Time-based One-time Password Algorithm (TOTP), який багато в чому успадковує риси батьків. У вересні 2010 на основі TOTP був розроблений потужний алгоритм аутентифікації OATH Challenge-Response Algorithm (OCRA).
Алгоритм HOTP також вніс інновації в технологію генерації одноразових паролів. Стійка по тим часам хеш-функція SHA-1 поєднувалася з нетривіальним рішенням наявності лічильника подій. Ці риси підняли HOTP на один рівень з такими перевіреними часом алгоритмами, як S/KEY.
Лічильники в HOTP і TOTP
Основною відмінністю між двома алгоритмами є генерація пароля на основі мітки часу, яку використовують в якості параметра TOTP-алгоритм. При цьому використовується не точне значення часу, а поточний інтервал, межі якого були встановлені заздалегідь (наприклад, 30 секунд)[5]
HOTP генерує ключ на основі розподіленого секрету і не залежного від часу лічильника. Модель цього алгоритму заснована на події — наприклад, кожен раз, коли генерується черговий одноразовий пароль, лічильник буде збільшуватися. Отже, згенеровані згодом паролі повинні бути різними кожен раз.
Завдяки цьому основа для лічильника в HOTP алгоритмі, на відміну від інших алгоритмів, що використовують таймер, захищена від розсинхронізації передавальних пристроїв або занадто великої відстані між ними (такої відстані, що відповідь від отримувача приходить пізніше, ніж закінчиться час валідності пароля). Це дозволяє HOTP-паролям залишатися дійсними протягом необмеженого кількості часу, в той час як TOTP-паролі перестануть бути дійсними через конкретний проміжок часу.
У підсумку, за умови використання тієї ж самої хеш-функції, як і в HOTP, дана відмінність у роботі алгоритму робить TOTP більш безпечним і кращим рішенням для одноразових паролів[6]
Опис алгоритму
Позначення
- — Секретний ключ, унікальний для кожного клієнта і відомий тільки йому і серверу. Довжина — 160 біт (рекомендована) або 128 біт (мінімальна)
- — Поточний стан 8-байтового лічильника події
- — Кількість цифр в генерованому паролі
- — Кількість невдалих спроб авторизації, після яких сервер заблокує з'єднання з клієнтом
- — Параметр розсинхронізації. Визначає максимальну розбіжність між лічильником сервера і клієнта, при якому одноразовий пароль буде прийнятий.
Загальний опис
Алгоритм повинен повертати не менше 6 цифр для забезпечення достатньої безпеки пароля. Залежно від рівня вимог до захисту, можна використовувати значення для HOTP, що складаються з більшої кількості цифр, для отримання більш стійкого до атак пароля. Роботу алгоритму можна описати наступною формулою:Процес роботи алгоритму можна розбити на наступні етапи:
- Створюється строка 20 байт, застосовуючи хеш-функцію , ініціалізована параметрам и :
- Вибираються певним чином 4 байта з :
- Чотири останніх біта останнього байта результату перетворюються в число
- Послідовність байтів перетворюється в змінну
- 31 біта Причина, через яку ігнорується старший біт ,полягає в різних варіантах реалізації цілочисельних обчислень у різних процесорів
- Результат роботи перетворюється до послідовності з цифр:
Приклад обчислення 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 |
- Останній байт має значення 0x5a
- Значення зсуву, отримане з молодших 4 біт — 0xa, це дає нам число 10
- Значення 4 послідовних байтів, починаючи з 10-ій позиції — 0x50ef7f19, яке перетворюється в двійковий код DBC1[7] (dynamic binary code)
- MSB, отримане з DBC1, одно 0x50. Тому DBC2[8]= DBC1 = 0x50ef7f19
- Далі, двійкові значення розглядаються як позитивне число, записане в порядку від старшого до меншого, у якого перший байт маскується значенням 0x7f.
- Для того, щоб отримати шестизначне число для HOTP, необхідно взяти число, отримане на попередньому кроці по модулю 106 —
Перевірка одноразового пароля
Перевірка значень лічильників
При створенні нового одноразового пароля генератором (клієнтом) значення лічильника клієнта збільшується на одиницю. Надалі значення лічильника подається на вхід хеш-функції разом з ключем . Після цього буде відправлено сервера аутентифікації, де воно буде порівняно зі значенням, обчисленим сервером. Якщо значення збігаються з урахуванням розбіжності не більше параметра розсинхронізації , то сервер збільшує на одиницю значення свого лічильника. Якщо дані не співпали, то сервер починає ресинхронизацию і повторює її в разі невдачі, поки не буде досягнута межа невдалих спроб аутентифікації . Після цього сервер блокує обліковий запис користувача.
Розсинхронізація між клієнтом і сервером
Як було згадано раніше, клієнт оновлює значення лічильника подій при кожній генерації одноразового пароля. У свою чергу, значення лічильника на сервері збільшується тільки після успішної автентифікації. Виходячи з цих тверджень можна описати причини, чому впровадження процесу ресинхронізації необхідно:
- Аутентифікація не пройдена. Клієнт оновив значення лічильника після створення пароля, а значення на сервері не змінилося
- Проблема зв'язку. Клієнт інкрементував значення лічильника після відправки пароля, але пароль не досяг сервера
Це призводить до необхідності використання параметра розсинхронізації , який буде відповідати за розміри вікна, в межах якого значення лічильника клієнта і сервера будуть вважатися синхронізованими.
Ресинхронізація лічильника
Ресинхронізація проводиться виключно сервером. Вона полягає в розрахунку нового значення для свого лічильника подій, щоб його значення співпадало з отриманими від клієнта в межах різниці між значеннями не більше . Якщо ця умова виконується, то сервер оновлює значення власного лічильника.
В іншому випадку сервер розраховує заново стан лічильника. В ході цього процесу сервер може запросити кілька разів додаткові значення одноразових паролів. Це зроблено для підвищення рівня безпеки, так як порівняння паролів у цьому випадку виконуються для двох або трьох пар. Якщо кількість спроб буде вичерпано, то сервер блокує обліковий запис користувача. Параметр також визначає вікно, в межах якого сервер збільшує лічильник в процесі ресинхронізації. Це обмеження параметром служить для:
- Обмеження шансу підбору вірного значення пароля
- Запобігти зацикленню розрахунку значення в рамках однієї перевірки
Безпека
Надійність алгоритму
Системи захисту, побудовані з використанням HOTP, володіють високим ступенем надійності. Вони, в більшості своїй, стійкі до широко поширеним криптографічних атак, наприклад:
- Атака виду «людина посередині» (Man-in-the-middle). Зловмисник не може підробити пересланого запрошення повідомлення, так як пароль змінюється досить часто. Безліч методів криптографічного аналізу стають при цьому малопридатними. У деяких реалізаціях лічильник, який використовується для створення пароля, змінює значення після кожної пересилання. Якщо повідомлення зашифровані з використанням досить сильного шифру, то HOTP робить підбір пароля майже неможливим.
- Атака повторного відтворення. Тут успіх залежить від конфігурації самої системи. У випадку, наприклад, коли використовується сервер аутентифікації для надання прав на вхід користувача, у атакуючого виникає ряд проблем. Сервер після кожного прийому повідомлення збільшує значення лічильника на одиницю. Тому елементарна відправка дубліката повідомлення не пройде перевірку — повідомлення створювалося за допомогою одного значення, а перевірка проводиться іншим.
- Якщо ключ складається з довільних цифр, то ймовірність успіху атаки методом прямого перебору при наявності спроб аутентифікації до моменту блокування розраховується за формулою . Наприклад, при 5 дозволених спробах введення шестизначного пароля і розмірі допустимого вікна шанс успіху при атаці становить 0,015 %.
Часто зловмиснику вдається вкрасти з сервера аутентифікації хешований пароль, по якому відбувається перевірка достовірності. Однак алгоритм для створення пароля використовує також лічильник подій. Оскільки початкове значення лічильника вибирається сервером, воно зазвичай випадкове, що ускладнює злом каналу зв'язку навіть при наявності у атакуючого розподіленого секрету.
Способи посилення захисту
Дані зміни не є обов'язковими або рекомендованими авторами алгоритму розширеннями. Однак для підвищення рівня безпеки власної реалізації можна застосувати такі варіанти:
- Збільшення довжини значення HOTP.
Витяг кожного нового символу з результату різко зменшує шанси успішної атаки. Завдяки цьому можна зробити процес роботи з паролями зручніше. Наприклад, збільшити кількість спроб введення або розширити діапазон, в якому порівнюються значення лічильників сервера і клієнта.
- Алфавітно-цифрові значення.
Сенс цієї ідеї полягає в тому, щоб використовувати не тільки цифри для пароля, але ще і символи A-Z. Вірніше, мова йде про набір з 32 символів з алфавітно-цифрового множини. Відразу ж стає видно, як виріс рівень безпеки паролів, тому що тепер ймовірність успіху повного перебору складає для паролів, які складаються з 6 символів.
- Ресинхронізація на базі лічильника.
Якщо умови дозволяють клієнту відправляти не тільки значення HOTP, але і інші дані, то можна зробити процес ресинхронізації набагато зручніше і безпечніше, якщо разом зі значенням HOTP клієнт буде відправляти серверу стан лічильника подій. В цьому випадку значення клієнтського HOTP буде виступати в ролі імітовставки для стану лічильника.
Перевіряючи таким чином значення лічильника на достовірність і відповідність, можна відмовитися від використання параметра розсинхронізації, що дозволить також підвищити рівень захисту алгоритму, тому що в оновленій системі ймовірність успіху атаки прямим перебором буде становити всього .
Застосування
Об'єднання OATH, стандартизовало HOTP, без жодних вказівок з приводу реалізації алгоритму. Навпаки, свобода розробників дозволяє знаходити все нові рішення, прагнучи задовольнити потреби замовника та внести інноваційний внесок у технологію OTP.[9]
Поширену реалізацію HOTP на Java можна знайти в пакеті org.jboss.security.otp, який входить у стандартні бібліотеки вільно розповсюджуваного веб-сервера Apache Jboss.
Ще одна реалізація на мові Java представлена безпосередньо об'єднанням OATH в пакеті org.openauthentication.otp.
Можна також згадати реалізацію — проект OATH Toolkit, бібліотека liboath якого дозволяє створювати паролі в режимі HOTP і TOTP.[10]
Велика кількість низькоінтеллектуальних пристроїв спеціально створено для генерації паролів або передачі даних за допомогою HOTP і TOTP (Feitian, SecuTech, SmartDisplayer, Vasco, Yubico, Protectimus[11]). Алгоритм також використовується в домашніх мережах для управління периферією за допомогою пульта дистанційного керування або мобільного телефону.
Вимоги до реалізації алгоритму
- Необхідно підтримувати двофакторну аутентифікацію. У даному випадку мається на увазі, що першим чинником є генератор одноразових паролів, а другим — якийсь додатковий секрет, який додається до одноразового паролю
- Сервер повинен бути захищений від атак методом прямого перебору, тобто обліковий запис користувача повинна блокуватися після певного числа невдалих спроб аутентифікації
- Необхідно використовувати захищений канал
Додатково
HOTP заснований на SHA-1, яка більше не вважається досить стійкою до колізій. Проте, алгоритм HOTP використовує тільки факт випадковості числа, вирахуваного на її основі, тому наявність колізій безпосередньо не впливає на його роботу.
Одностороння аутентифікація передбачає, що клієнт за потреби намагається встановити зв'язок. Після чого сервер відправляє запит назад клієнтові і перевіряє його відповідь на справжність. Модифікація алгоритму OCRA дозволяє також і користувачеві провести аутентифікацію сервера.
Дивись також
Примітки
- ↑ Hoornaert, Frank, Naccache, David, Bellare, Mihir, Ranen, Ohad. HOTP: An HMAC-Based One-Time Password Algorithm (англ.). tools.ietf.org. Процитовано 26 березня 2017.
- ↑ «Algorithm agility and OATH» by Burt Kaliski, RSA Laboratories.May 19, 2005.
- ↑ «HOTP-Based User Authentication Scheme in Home Networks» by Binod Vaidya, Jong Hyuk Park and Joel J.P.C. Rodrigues. 2009
- ↑ «OATH: yesterday, today, and tomorrow» by Nathan Willis, December 15, 2010.
- ↑ Nathan Schmidt. Nathan Schmidt — Breakdown: HMAC-Based One-Time Passwords. nathschmidt.net. Архів оригіналу за 3 квітня 2016. Процитовано 27 березня 2017.
- ↑ One-Time Passwords – HOTP and TOTP. aldaris' blog (брит.). 28 лютого 2014. Процитовано 22 березня 2017.
- ↑ M. Bellare, R. Canetti and H. Krawczyk. .
- ↑ Krawczyk, H., Bellare, M., and R. Canetti. .
- ↑ «Attacks on SHA-1» by Initiative for Open AuTHentication,March 2, 2005.
- ↑ «Introducing the OATH Toolkit» by Simon Josefsson, 2011.
- ↑ Protectimus.