Однако если сервер признает допустимым слишком большой разброс значений времени, то пользователь С может перехватить значение, сгенерированное пользователем А, и отправить его на сервер, с успехом выдавая себя за А. Эта атака называется атакой воспроизведения. Пользователь С не знает секретного ключа шифрования пользователя А, но, быстро передавая воспроизведенный шифртекст, может имитировать повторное обращение пользователя А к серверу.
Рис. 2.3.
Аутентификация при помощи неявного запроса
Этот механизм не слишком серьезно совершенствует схему "запрос-ответ", он также с трудом поддерживает аутентификацию пользователя на многих серверах и не обеспечивает взаимной аутентификации, кроме того, он уязвим для атак воспроизведения. Лучшие свойства механизма "запрос-ответ" и неявного запроса на базе времени удалось совместить при использовании для аутентификации односторонней хэш-функции.
Аутентификация с использованием хэш-функции
Для решения проблем аутентификации, связанных с неявными запросами, Лесли Лампорт [85] предложил использовать одноразовые пароли, генерируемые при помощи односторонней хэш-функции (см. лекцию 3). Эта идея нашла воплощение в системе одноразовых паролей S/Key One-Time Password System [136]. Система S/Key, применяя одностороннюю хэш-функцию, генерирует последовательность одноразовых паролей. Начальное значение хэш-кода вычисляется путем хэширования секретного пароля пользователя, который сцеплен с несекретным случайным числом, выработанным генератором случайных чисел.
Секретный пароль должен иметь длину не менее 8 символов. Последовательность одноразовых паролей формируется в результате многократного применения секретной хэш-функции (от 500 до 1000 ). То есть первый одноразовый пароль генерируется путем применения хэш-функции к секретному паролю пользователя определенное количество раз ( N ), следующий одноразовый пароль - путем применения хэш-функции к секретному паролю пользователя только (N - 1) раз и т.д.
Субъект, получивший одноразовый пароль путем прослушивания сети, не в состоянии сгенерировать следующий пароль, так как для этого требуется просчитать хэш-функцию в обратном направлении. Это не может быть сделано без знания секретного пароля, с которого начинались итерации. Поскольку в системе S/Key секретный пароль пользователя никогда не передается по сети и не хранится ни сервером, ни клиентом, риск хищения отсутствует.
S/Key - это система "клиент-сервер". Сервер генерирует отклик после получения от клиента login-запроса. Отклик сервера содержит номер итерации и случайное число. В ответ пользователь генерирует соответствующий одноразовый пароль, используя комбинацию своего секретного пароля, номера итерации и случайного числа, и отправляет его серверу. Первый одноразовый пароль из списка итераций сохраняется на шаге инициализации.
Сервер может и сам формировать S/Key -запрос, состоящий из номера итерации и случайного числа. Тогда, используя номер итерации и случайное число вместе со своим секретным паролем, пользователь вычисляет (или преобразует) одноразовый пароль. Сервер может не формировать запрос, если пользователь сохраняет номер итерации и случайное число после каждой своей успешной попытки аутентификации. Для хранения этих значений могут использоваться портативные устройства типа смарт-карт или карманных персональных компьютеров.
Итак, пользователь передает для проверки на сервер одноразовый пароль. Сервер сначала сохраняет копию этого одноразового пароля, а затем применяет к нему хэш-функцию. Если результат не совпадает с копией одноразового пароля, полученного во время последней удачной попытки аутентификации пользователя, то запрос отвергается. Если совпадает, тогда клиентская запись в файле паролей обновляется копией полученного от пользователя одноразового пароля, которая была сохранена перед вычислением хэш-функции. Обновление пароля обеспечивает возможность проверки следующего одноразового пароля. Так как следующий одноразовый пароль
получается путем вычисления хэш-функции на один раз меньше, чем для предыдущего пароля, то получить предыдущий пароль можно, применив хэш-функцию к следующему паролю на один раз больше.