Loading AI tools
З Вікіпедії, вільної енциклопедії
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.
Основною відмінністю між двома алгоритмами є генерація пароля на основі мітки часу, яку використовує в якості параметра алгоритм TOTP. При цьому використовується не точне значення часу, а поточний інтервал, межі якого були встановлені заздалегідь (наприклад, 30 секунд)[5]
HOTP генерує ключ на основі розподіленого секрету і не залежного від часу лічильника. Модель цього алгоритму заснована на події — наприклад, кожен раз, коли генерується черговий одноразовий пароль, лічильник буде збільшуватися. Отже, згенеровані згодом паролі повинні бути різними кожен раз.
Завдяки цьому основа для лічильника в HOTP алгоритмі, на відміну від інших алгоритмів, що використовують таймер, захищена від розсинхронізації передавальних пристроїв або занадто великої відстані між ними (такої відстані, що відповідь від отримувача приходить пізніше, ніж закінчиться час валідності пароля). Це дозволяє HOTP-паролям залишатися дійсними протягом необмеженого кількості часу, в той час як TOTP-паролі перестануть бути дійсними через конкретний проміжок часу.
У підсумку, за умови використання тієї ж самої хеш-функції, як і в HOTP, дана відмінність у роботі алгоритму робить TOTP більш безпечним і кращим рішенням для одноразових паролів[6]
Щоб перевірити та зрозуміти як працює алгоритм HOTP на практиці, можна скористатися онлайн генератором одноразових паролів HOTP.
Алгоритм повинен повертати не менше 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 буде виступати в ролі імітовставки для стану лічильника.
Перевіряючи таким чином значення лічильника на достовірність і відповідність, можна відмовитися від використання параметра розсинхронізації, що дозволить також підвищити рівень захисту алгоритму, тому що в оновленій системі ймовірність успіху атаки прямим перебором буде становити всього .
Об'єднання 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 дозволяє також і користувачеві провести аутентифікацію сервера.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.