Идентификация - аутентификация. Часть 3. Протоколы типа "Запрос - Ответ"

В прошлый раз мы рассмотрели протоколы основанные на фиксированных паролях. И , хотя, использование одноразовых паролей помогло решить некоторые проблемы, всёже это не панацея и для веб приложений слабоприменимо. Поэтому рассмотрим следующий, более надёжный принцип идентификации - аутентификации: "Запрос- ответ".
Это третья теоритическая заметка из цикла.
Пункт классификации 1.2 - Протоколы типа "Запрос-Ответ".
---
Итак, от части - это похоже чем-то на генерацию одноразовых паролей (в большинстве случаев на практике), но местами принципы протоколов "Запрос-Ответ" могут и отличаться. Основная идея тут в том, что A убеждает B в своей аутентичности путём демонстрации знания некоторого секрета без предъявления самого секрета. Знание секрета подтверждается выдачей ответов на меняющиеся со временем щапросы B.
Это не позволяет злоумышленнику, перехватившему "подтверждение" (обмен) повторить всё в точности.

Для лучшей защиты есть рекомендации к протоколам:

  • Обмен между A и B не должен давать хоть малейшей информации о секрете и возможности перехватчику пройти последующую ложную идентификацию путём анализа сообщений.
  • Используют случайные числа в запросах.
  • Неповторяющиеся числа (обычно возрастающие последовательности) - используются как уникальные метки сообщений и обеспечивают защиту от навязывания ранее переданных сообщений
  • Вместо вышеперечисленного, можно использовать временные метки - они позволяют бороться с задержкой сообщений, за счёт доверительного временного интервала.

--
Пример простого протокола:

  1. A запрашивает у B начало идентификации, скажем передав login
  2. B передаёт A значение времени и случайное число - метку
  3. A отправляет H(H(pwd + salt) + time(время) + z(метка)+name(B))
  4. B считает тоже значение и сравнивает, если они равны и значение времени не превосходит порог погрешности, то идентифицирует A

Имя B используется в качестве дополнительной защиты от подмены идентификатора.

Как видно, даже перехватив и заблокировав трафик злоумышленник много-го не добъётся. Единственное, если очень быстро переслать те же пакеты от своего имени, а пакеты A задержать насовсем, то возможно попасть во временной интервал и аутентифицироваться. Но только один раз. Для последующих атак, надо повторять всё сначала.

Существуют и более сложные разновидности. Давайте разобъём протоколы на два класса:

  1. Односторонняя идентификация идентификация
  2. Взаимная идентификация

Кстати, пример выше - это односторонняя идентификация

------
Рассмотрим различные виды односторонней идентификации:

  • На основе симметричного шифрования.
    Скажем у A и B имеется общий секретный ключ шифрования (обычно генерируемый на основе пароля - ну общего секрета), тогда всё тоже что и в простом случае, только шифруем этим ключом. К примеру для идентификации A отправляет B зашифрованную этим ключом. A -> B : Ek(time, nameB), где Ek - это функция шифрования с помощью ключа k.
  • Используя ассиметричное шифрование.
    В этом случае необходимо произвести обмен открытыми ключами, тогда суть в том, чтобы расшифровать сообщение от B и правильно ответить на это сообщение. Тут используются хэш-функции, для предотвращения попытки криптоанализа с помощью выбранного открытого текста. Итак, вот как это выглядит:
    1. A запрашивает у B H(z), id(B),c, где H(z) - хэш-функция от случайного числа z, c = Ea(z,id(B)) - Ea - шифрование с ключом A
    2. A расшифровывает c и проверяет хэш и идентификатор B
    3. если всё верно то A отправляет B z и последняя сторона идентифицирует A если z верно
  • Используя подзапросом свою цифровую подпись
    К примеру, A->B: ta, id(B), Sa(ta, id(B)), где Sa - это цифровая подпись, ta - метка времени. B знает алгоритм проверки подписи, и проверяет что временная метка лежит в допустимых пределах, идентификатор B верен, а также подпись также верна и принадлежит A.

--
Взаимная идентификация подразумевает что B также себя идентифицирует по аналогии с A.

На данный момент всё, я устал, ждите остальных частей.