OCRA

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

OCRA (OATH Challenge-Response Algorithm, RFC 6287. ) — алгоритм, що об'єднує в собі можливості автентифікації клієнта, взаємної автентифікації і підписі транзакцій, використовує одноразові паролі. Є модифікацією алгоритму HOTP. Основною відмінністю OCRA від HOTP є те, що в якості вхідних даних використовується випадкове значення, прийняте від сервера, а не лічильник подій.

Історія[ред. | ред. код]

OATH розробляло алгоритми автентифікації на базі одноразових паролів з 2004 року. Через стрімкий розвиток мобільної індустрії ці алгоритми користувалися великою популярністю. Наприкінці 2005 року був опублікований HOTP. Алгоритм HOTP для створення одноразових паролів використовує лічильник, який не залежить від часу. Це дозволяє уникнути розсинхронізації при великій відстані між клієнтом і сервером.[1][2]

OATH в 2008 році представила алгоритм TOTP, який є модифікацією HOTP.[3] TOTP для аутентифікації генерує пароль, що залежить від часу, на відміну від HOTP, де пароль створювався на основі лічильника. Пароль дійсний лише протягом певного часового проміжку. Завдяки цьому частково вирішується проблема розсинхронізації вузлів, що знаходяться далеко один від одного, при цьому немає втрати зв'язку із-за випадкового або навмисного скидання лічильників.[4]

Восени 2010 року OATH модифікувала TOTP, представивши алгоритм OCRA. Основна його перевага дає той факт, що є можливість проходження сервером автентифікації. Алгоритм також здатний створювати електронний цифровий підпис, причому сервер також можна автентифікувати.[1]

Загальна схема[ред. | ред. код]

Використані позначення:[5]

  • — функція, що виконує обчислення, використовуючи секретний ключ K і структуру DataInput.
    За замовчуванням використовується HOTP з шестизначним значенням на базі SHA-1 (HOTP-SHA1-6).
    Рекомендується використовувати наступні криптофункції:
    • HOTP-SHA1-4
    • HOTP-SHA1-6
    • HOTP-SHA1-8
    • HOTP-SHA256-6
    • HOTP-SHA512-6
  • — секретний ключ, відомий обом сторонам.
  • — структура, яка містить набір різних вхідних даних.
    Параметри DataInput:
    Позначення:
    • — роздільник.
    • — лічильник довжиною в 8 байт, повинен бути синхронізований між обома сторонами.
    • — апит довжиною в 128 байт, в разі меншої довжини його потрібно доповнити нулями.
    • — це геш-функція від PIN-коду, який знають і клієнт і сервер.
    • — строка до 512 байт. Описує стан сесії. Довжина вказана в OCRASuite. 
    • — кількість минулих проміжків часу від умовної точки відліку, за яку прийнята дата 1 січня 1970 року, довжина 8 байт. Одиниці виміру вказані в OCRASuite.
    • -строка, що містить набір параметрів для формування відповіді. Для двосторонньої автентифікації і підпису клієнт і сервер повинні обмінятися двома рядками OCRASuite: одна для сервера, інша клієнта.
      Структура : , де:
      • — вказує версію OCRA. Значення: OCRA-v, де v - це номер версії OCRA (1 або 2).
      • — відображає поточну функцію, яка буде використовуватися для обчислення значення OCRA.
      • — відображає список допустимих входів для даного обчислення.
        — параметри DataInput для режиму “запит-відповідьт”.
        — параметри DataInput для звичайного підпису.
        У квадратних дужках дано необов'язкові входи. Кожен параметр обчислень описується однією буквою (крім Q) і відділяється дефісами.
        • — вказує на подальше визначення формату F. Можливі значення змінної F: A - алфавітно-цифровий, N - цифровий, H - шістнадцятковий. Можлива довжина xx - від 04 до 64. За замовчуванням формат запиту має значення N08 (цифровий, довжиною в 8 символів).
        • — вказує на подальше визначення хеш-функції (H), яка застосовується до PIN-коду (SHA1, SHA256 або SHA512). За замовчуванням SHA1.
        • — говорить про надання довжини сесії (nnn). За замовчуванням 064.
        • — вказівка кроку часу G. ([1-59] S - кількість секунд, [1-59] M - кількість хвилин, [0-48] H - кількість годин).

Типові режими роботи[ред. | ред. код]

Одностороння автентифікація[ред. | ред. код]

У цьому режимі сервер повинен відправити випадковий запит клієнтові, який, в свою чергу, повинен надати коректну відповідь, щоб пройти автентифікацію. Обидві сторони повинні заздалегідь узгодити секретний ключ K.[4] [5]

При цьому повинні використовуватися наступні параметри:[5]

  • C — лічильник, необов'язковий параметр.
  • Q — запит, обов'язковий параметр, формується сервером.
  • P — геш-функція від PIN-коду, необов'язковий параметр.
  • S — стан сесії, необов'язковий параметр.
  • T — крок часу, необов'язковий параметр.

Алгоритм дій:[5]

  1. Сервер посилає запит Q клієнту.
  2. Клієнт формує R = OCRA(K, {[C] | Q | [P | S | T]}) і відсилає на сервер відповідь R.
  3. Сервер перевіряє відповідь R. Якщо відповідь коректний, посилає клієнту OK, в іншому випадку — NOK.

Взаємна автентифікація[ред. | ред. код]

У даному режимі клієнт і сервер аутентифікують один одного. Клієнт посилає випадковий запит серверу, який формує відповідь і відправляє клієнту разом зі своїм запитом. Клієнт спочатку перевіряє відповідь сервера, щоб переконатися, що той коректний. Після цього клієнт формує свою відповідь і відправляє його серверу. Сервер перевіряє відповідь клієнта і тим самим завершує процес взаємної автентифікації. Обидві сторони повинні заздалегідь узгодити секретний ключ K.[4] [5]

Параметри сервера для відповіді:[5]

  • C — лічильник, необов'язковий параметр.
  • QC — запит, обов'язковий параметр, формується клієнтом.
  • QS — запит, обов'язковий параметр, формується сервером.
  • S — стан сесії, необов'язковий параметр.
  • T — крок часу, необов'язковий параметр.

Параметри клієнта для відповіді:[5]

  • C — лічильник, необов'язковий параметр.
  • QS — запит, обов'язковий параметр, формується сервером.
  • QC — запит, обов'язковий параметр, формується клієнтом.
  • P — геш-функція від PIN-коду, необов'язковий параметр.
  • S — стан сесії, необов'язковий параметр.
  • T — крок часу, необов'язковий параметр.

Алгоритм дій:[5]

  1. Клієнт посилає серверу запит QC.
  2. Сервер формує RS = OCRA(K, [C] | QC | QS | [S | T]). Відправляє клієнту RS і свій запит QS.
  3. Клієнт перевіряє відповідь сервера і обчислює свою відповідь RC = OCRA(K, [C] | QS | QC | [P | S | T]). Посилає серверу RC.
  4. Сервер перевіряє відповідь клієнта і у разі успіху відправляє підтвердження автентифікації.

Простий підпис[ред. | ред. код]

Сервер повинен передати клієнту якесь значення на підпис. Цим значенням може бути, наприклад, інформація, яку потрібно підписати, або геш-функція від цієї інформації. Обидві сторони повинні заздалегідь узгодити секретний ключ K.[5]

Використовуються наступні параметри:[5]

  • C — лічильник, необов'язковий параметр.
  • QS — запит на підпис, обов'язковий параметр, формується сервером.
  • P — геш-функція від PIN-коду, необов'язковий параметр.
  • T — крок часу, необов'язковий параметр.

Алгоритм дій:[5]

  1. Сервер посилає запит Q на підпис клієнту.
  2. Клієнт формує SIGN = OCRA(K, [C] | QS | [P | T]) і відсилає на сервер відповідь SIGN.
  3. Сервер перевіряє відповідь R. Якщо відповідь коректний, посилає клієнту OK.

Підпис з автентифікацією сервера[ред. | ред. код]

У цьому випадку клієнт спочатку перевіряє справжність сервера, а вже потім обчислює і відправляє електронний підпис. Клієнт спочатку відправляє випадкове значення в якості запиту на сервер, після чого сервер посилає клієнтові свою відповідь на його запит та інформацію на підпис. Обидві сторони повинні заздалегідь узгодити секретний ключ K.[5]

Параметри сервера для відповіді:[5]

  • C — лічильник, необов'язковий параметр.
  • QC — запит, обов'язковий параметр, формується клієнтом.
  • QS — запит на підпис, обов'язковий параметр, формується сервером.
  • T — крок часу, необов'язковий параметр.

Параметри клієнта для відповіді:[5]

  • C — лічильник, необов'язковий параметр.
  • QC — запит, обов'язковий параметр, формується клієнтом.
  • QS — запит на підпис, обов'язковий параметр, формується сервером.
  • P — геш-функція від PIN-коду, необов'язковий параметр.
  • T — крок часу, необов'язковий параметр.

Алгоритм дій:[5]

  1. Клієнт посилає серверу запит QC.
  2. Сервер формує RS = OCRA(K, [C] | QC | QS | [T]). Відправляє клієнту RS і свій запит QS на підпис.
  3. Клієнт перевіряє відповідь сервера і обчислює свою відповідь SIGN = OCRA( K, [C] | QS | QC | [P | T]). Посилає серверу SIGN.
  4. Сервер перевіряє відповідь клієнта і у разі успіху відправляє підтвердження аутентифікації OK.

Вимоги до реалізації[ред. | ред. код]

  • Алгоритм повинен підтримувати аутентифікацію за методом "запит-відповідь".
  • Алгоритм повинен підтримувати алгоритм підпису на основі симетричного ключа.
  • Алгоритм повинен підтримувати автентифікацію сервера.
  • Рекомендується використовувати в якості криптофункції HOTP.
  • Рекомендується довжину і формат вхідного запиту реалізувати з можливістю клнфігурації.
  • Рекомендується довжину і формат вихідного відповіді реалізувати з можливістю клнфігурації.
  • Запит може бути реалізований з можливістю перевірки цілісності, наприклад, можна використовувати біти парності для простих перевірок на помилки.
  • Ключ повинен бути унікальним для кожного генератора, і ключ повинен бути випадковим числом.
  • Алгоритм може включати в себе додаткові атрибути даних, такі як інформація про час або номер сеансу, які будуть включені в розрахунок. Ці дані входи можуть використовуватися окремо або всі разом. [5]

Надійність алгоритму[ред. | ред. код]

Системи автентифікації, побудовані на базі одноразових паролів, є досить надійними. При цьому OCRA має ряд переваг у порівнянні зі своїми попередниками, алгоритмами TOTP і HOTP.[4]

Один із серйозних методів атаки - підміна сервера аутентифікації, що може виявитися ефективним при атаках на TOTP і HOTP. При цьому зловмисник отримує дані від користувача і може використовувати їх для зв'язку з сервером. Однак у випадку алгоритму OCRA, що працює за методом "запит-відповідь", зловмисник повинен виступати в якості посередника між користувачем і сервером. Зловмиснику доведеться підміняти ще і адресу клієнта, щоб одержувати дані з сервера і використовувати їх для зв'язку з клієнтом.[4]

Також алгоритм OCRA може бути реалізований стійким до атаки, заснованої на розсинхронізації таймерів або лічильників, до якої схильні HOTP і TOTP, так як ці параметри в OCRA можна комбінувати. При введенні лічильника відправка повторного повідомлення зловмисником, що працюють за методом "людина посередині" (Man-in-the-middle), буде невдалою, так як лічильник на стороні сервера (або клієнта, дивлячись кого намагається імітувати зловмисник) зміниться і повідомлення буде перевірятися вже не тим значенням, з допомогою якої воно створювалося. Можна змінювати та проміжок часу, протягом якого пароль дійсний, в залежності від відстані між клієнтом і сервером, уникаючи розсинхронізації.[4]

Порівняння з аналогами[ред. | ред. код]

Основними конкурентами OCRA серед алгоритмів, що працюють за методом "запит-відповідь" є SCRAM та CHAP. Порівняно з ними, OCRA має як переваги, так і недоліки. Всі три алгоритму підтримують взаємну автентифікацію, але спочатку в CHAP ця можливість не замислювалася як важлива частина алгоритму. Також в CHAP кожна передача даних здійснюється у вигляді пакета з зазначенням призначення даного пакета, його довжини і т. д. Це збільшує обсяг даних, які пересилаються і може погіршити роботу алгоритму при повільному з'єднанні. Але така форма повідомлень дозволяє проводити деякі додаткові операції, наприклад, зміна секретного слова, що зберігається і у сервера і клієнта. У OCRA така можливість відсутня, алгоритм не підтримує можливість змінювати секрет.

У SCRAM у сервера і клієнта є масиви ключів, захищені сіллю. Це дозволяє змінювати ключ при кожному новому сеансі автентифікації. Також в SCRAM є можливість виявлення атаки методом "людина посередині". При успішному виявленні такої атаки зв'язок між клієнтом і сервером зупиняється.

OCRA і SCRAM, на відміну від CHAP, в якості аргументу криптофункції використовують випадкове значення, отримане з сервера. OCRA володіє можливістю створення електронного підпису, в той час як в SCRAM за допомогою підпису проводиться аутентифікація. Сервер (клієнт) надсилає клієнту (серверу) параметри для криптофункції і зашифрований текст. Після цього клієнт (сервер) розшифровує текст, підписує його і відправляє серверу (клієнту). При підтвердженні справжності підпису автентифікація вважається пройденою. OCRA, на відміну від своїх конкурентів, володіє можливістю використання лічильників і таймерів в якості додаткового захисту від злому. [6] [7]

Примітки[ред. | ред. код]

Джерела[ред. | ред. код]