HOTP

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

HOTP (англ. HMAC-Based One-Time Password Algorithm) — алгоритм захищеної автентифікації з використанням одноразового пароля (One Time Password, OTP). Заснований на HMAC (SHA-1). Є алгоритмом односторонньої автентифікації, а саме: сервер виконує автентифікацію клієнта.

В якості параметра, що відповідає за динаміку генерації паролів, використовується подія, тобто сам факт генерації[1]: кожного разу при створенні нового пароля лічильник подій збільшує своє значення на одиницю, і саме це монотонне зростаюче значення використовується як основний параметр алгоритму. Другим параметром для розрахунку одноразових паролів є симетричний ключ, який повинен бути унікальним для кожного генератора (клієнта) і закритим від усіх, крім сервера і самого генератора (клієнта).

Історія

[ред. | ред. код]

Алгоритм уперше формально описано командою IETF в грудні 2011.[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]

Щоб перевірити та зрозуміти як працює алгоритм HOTP на практиці, можна скористатися онлайн генератором одноразових паролів HOTP.

Опис алгоритму

[ред. | ред. код]

Позначення

[ред. | ред. код]
  • — Секретний ключ, унікальний для кожного клієнта і відомий тільки йому і серверу. Довжина — 160 біт (рекомендована) або 128 біт (мінімальна)
  • — Поточний стан 8-байтового лічильника події
  • — Кількість цифр в генерованому паролі
  • — Кількість невдалих спроб авторизації, після яких сервер заблокує з'єднання з клієнтом
  • — Параметр розсинхронізації. Визначає максимальну розбіжність між лічильником сервера і клієнта, при якому одноразовий пароль буде прийнятий.

Загальний опис

[ред. | ред. код]

Алгоритм повинен повертати не менше 6 цифр для забезпечення достатньої безпеки пароля. Залежно від рівня вимог до захисту, можна використовувати значення для HOTP, що складаються з більшої кількості цифр, для отримання більш стійкого до атак пароля. Роботу алгоритму можна описати наступною формулою: Процес роботи алгоритму можна розбити на наступні етапи:

  1. Створюється строка 20 байт, застосовуючи хеш-функцію , ініціалізована параметрам і :
  2. Вибираються певним чином 4 байта з :
    1. Чотири останніх біта останнього байта результату перетворюються в число
    2. Послідовність байтів  перетворюється в змінну
    3.  31 біта Причина, через яку ігнорується старший біт ,полягає в різних варіантах реалізації цілочисельних обчислень у різних процесорів
  3. Результат роботи  перетворюється до послідовності з цифр:

Приклад обчислення 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
  1. Останній байт має значення 0x5a
  2. Значення зсуву, отримане з молодших 4 біт — 0xa, це дає нам число 10
  3. Значення 4 послідовних байтів, починаючи з 10-ій позиції — 0x50ef7f19, яке перетворюється в двійковий код DBC1[7] (dynamic binary code)
  4. MSB, отримане з DBC1, одно 0x50. Тому DBC2[8]= DBC1 = 0x50ef7f19
  5. Далі, двійкові значення розглядаються як позитивне число, записане в порядку від старшого до меншого, у якого перший байт маскується значенням 0x7f.
  6. Для того, щоб отримати шестизначне число для HOTP, необхідно взяти число, отримане на попередньому кроці по модулю 106

Перевірка одноразового пароля

[ред. | ред. код]

Перевірка значень лічильників

[ред. | ред. код]

При створенні нового одноразового пароля генератором (клієнтом) значення лічильника клієнта збільшується на одиницю. Надалі значення лічильника подається на вхід хеш-функції разом з ключем . Після цього буде відправлено сервера аутентифікації, де воно буде порівняно зі значенням, обчисленим сервером. Якщо значення збігаються з урахуванням розбіжності не більше параметра розсинхронізації , то сервер збільшує на одиницю значення свого лічильника. Якщо дані не співпали, то сервер починає ресинхронизацию і повторює її в разі невдачі, поки не буде досягнута межа невдалих спроб автентифікації . Після цього сервер блокує обліковий запис користувача.

Розсинхронізація між клієнтом і сервером

[ред. | ред. код]

Як було згадано раніше, клієнт оновлює значення лічильника подій при кожній генерації одноразового пароля. У свою чергу, значення лічильника на сервері збільшується тільки після успішної автентифікації. Виходячи з цих тверджень можна описати причини, чому впровадження процесу ресинхронізації необхідно:

  1. Аутентифікація не пройдена. Клієнт оновив значення лічильника після створення пароля, а значення на сервері не змінилося
  2. Проблема зв'язку. Клієнт інкрементував значення лічильника після відправки пароля, але пароль не досяг сервера

Це призводить до необхідності використання параметра розсинхронізації , який буде відповідати за розміри вікна, в межах якого значення лічильника клієнта і сервера будуть вважатися синхронізованими.

Ресинхронізація лічильника

[ред. | ред. код]

Ресинхронізація проводиться виключно сервером. Вона полягає в розрахунку нового значення для свого лічильника подій, щоб його значення співпадало з отриманими від клієнта в межах різниці між значеннями не більше . Якщо ця умова виконується, то сервер оновлює значення власного лічильника.

В іншому випадку сервер розраховує заново стан лічильника. В ході цього процесу сервер може запросити кілька разів додаткові значення одноразових паролів. Це зроблено для підвищення рівня безпеки, так як порівняння паролів у цьому випадку виконуються для двох або трьох пар. Якщо кількість спроб буде вичерпано, то сервер блокує обліковий запис користувача. Параметр також визначає вікно, в межах якого сервер збільшує лічильник в процесі ресинхронізації. Це обмеження параметром служить для:

  1. Обмеження шансу підбору вірного значення пароля
  2. Запобігти зацикленню розрахунку значення в рамках однієї перевірки

Безпека

[ред. | ред. код]

Надійність алгоритму

[ред. | ред. код]

Системи захисту, побудовані з використанням 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]). Алгоритм також використовується в домашніх мережах для управління периферією за допомогою пульта дистанційного керування або мобільного телефону.

Вимоги до реалізації алгоритму

[ред. | ред. код]
  1. Необхідно підтримувати двофакторну аутентифікацію. У даному випадку мається на увазі, що першим чинником є генератор одноразових паролів, а другим — якийсь додатковий секрет, який додається до одноразового паролю
  2. Сервер повинен бути захищений від атак методом прямого перебору, тобто обліковий запис користувача повинна блокуватися після певного числа невдалих спроб аутентифікації
  3. Необхідно використовувати захищений канал

Додатково

[ред. | ред. код]

HOTP заснований на SHA-1, яка більше не вважається досить стійкою до колізій. Проте, алгоритм HOTP використовує тільки факт випадковості числа, вирахуваного на її основі, тому наявність колізій безпосередньо не впливає на його роботу.

Одностороння аутентифікація передбачає, що клієнт за потреби намагається встановити зв'язок. Після чого сервер відправляє запит назад клієнтові і перевіряє його відповідь на справжність. Модифікація алгоритму OCRA дозволяє також і користувачеві провести аутентифікацію сервера.

Дивись також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. Hoornaert, Frank, Naccache, David, Bellare, Mihir, Ranen, Ohad. HOTP: An HMAC-Based One-Time Password Algorithm (англ.). tools.ietf.org. Архів оригіналу за 6 квітня 2019. Процитовано 26 березня 2017.
  2. «Algorithm agility and OATH» by Burt Kaliski, RSA Laboratories.May 19, 2005.
  3. «HOTP-Based User Authentication Scheme in Home Networks» by Binod Vaidya, Jong Hyuk Park and Joel J.P.C. Rodrigues. 2009
  4. «OATH: yesterday, today, and tomorrow» by Nathan Willis, December 15, 2010.
  5. Nathan Schmidt. Nathan Schmidt — Breakdown: HMAC-Based One-Time Passwords. nathschmidt.net. Архів оригіналу за 3 квітня 2016. Процитовано 27 березня 2017.
  6. One-Time Passwords – HOTP and TOTP. aldaris' blog (брит.). 28 лютого 2014. Архів оригіналу за 11 червня 2018. Процитовано 22 березня 2017.
  7. M. Bellare, R. Canetti and H. Krawczyk. .
  8. Krawczyk, H., Bellare, M., and R. Canetti. .
  9. «Attacks on SHA-1» by Initiative for Open AuTHentication,March 2, 2005.
  10. «Introducing the OATH Toolkit» by Simon Josefsson, 2011.
  11. Protectimus. Архів оригіналу за 20 квітня 2018. Процитовано 4 квітня 2018.

Посилання

[ред. | ред. код]