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]

Примечания

[править | править код]