Введение

Система одноразовых паролей S/KEY – это система одноразовых паролей, разработанная для аутентификации в Unix-подобных операционных системах, особенно при использовании простых терминалов или ненадежных общедоступных компьютеров, где нежелательно вводить постоянный пароль. Реальный пароль пользователя объединяется в автономном устройстве с коротким набором символов и убывающим счетчиком для формирования пароля одноразового использования. Поскольку каждый пароль используется только один раз, он бесполезен для перехватчиков паролей. Так как короткий набор символов не меняется до тех пор, пока счетчик не достигнет нуля, можно заранее подготовить список одноразовых паролей в порядке возрастания, который пользователь может носить с собой. Альтернативно, пользователь может предоставить пароль, набор символов и желаемое значение счетчика локальному калькулятору для генерации соответствующего одноразового пароля, который затем можно передать по сети в открытом виде. Последний способ более распространен и фактически представляет собой аутентификацию по типу «вызов-ответ». S/KEY поддерживается в Linux (через подключаемые модули аутентификации), OpenBSD, NetBSD и FreeBSD, а также существует универсальная реализация с открытым исходным кодом, позволяющая использовать ее в других системах. OpenSSH также реализует S/KEY, начиная с версии OpenSSH 1.2.2, выпущенной 1 декабря 1999 года. Одной из распространенных реализаций является OPIE. S/KEY является торговой маркой Telcordia Technologies, ранее известной как Bell Communications Research (Bellcore). S/KEY также иногда называют схемой Лампорта, в честь ее автора, Лесли Лампорта. Она была разработана Нилом Халлером, Филом Карном и Джоном Уолденом в Bellcore в конце 1980-х годов. С истечением срока действия основных патентов на криптографию с открытым ключом и широким распространением ноутбуков с SSH и другими криптографическими протоколами, способными защитить всю сессию, а не только пароль, S/KEY постепенно выходит из употребления. В то же время, схемы, реализующие двухфакторную аутентификацию, становятся все более популярными.

Аутентификация

После генерации паролей у пользователя есть лист бумаги с n паролями. Если n очень велико, то хранение всех n паролей или вычисление заданного пароля из H(W) становятся неэффективными. Существуют методы для эффективного вычисления паролей в требуемом порядке, используя только одно хеш-вычисление за шаг и храня небольшое количество паролей. В идеале, хотя на практике это встречается реже, пользователь может иметь с собой небольшое, портативное, безопасное, не подключенное к сети вычислительное устройство, способное восстанавливать любой необходимый пароль, зная секретную фразу, соль и количество итераций хеширования, причем последние два параметра удобно предоставляет сервер, запрашивающий аутентификацию для входа в систему. В любом случае, первый пароль будет таким же, как и тот, что хранится на сервере. Этот первый пароль не будет использоваться для аутентификации (пользователь должен вычеркнуть этот пароль на листе бумаги), вместо него будет использован второй: пользователь предоставляет серверу второй пароль из списка и вычеркивает его. Сервер пытается вычислить H(i), где i – предоставленный пароль. Если H(i) выдает первый пароль (тот, который хранится на сервере), то аутентификация успешна. Сервер затем сохранит i в качестве текущей ссылки. Для последующих аутентификаций пользователь будет предоставлять i. (Последний пароль в напечатанном списке, n, является первым паролем, сгенерированным сервером, H(W), где W – исходный секрет). Сервер вычислит H(i) и сравнит результат с i-1, который хранится на сервере в качестве ссылки.

Безопасность

Безопасность S/KEY основана на сложности восстановления криптографических хеш-функций. Предположим, злоумышленнику удается получить пароль, который был использован для успешной аутентификации. Если этот пароль равен i, он уже бесполезен для последующих аутентификаций, поскольку каждый пароль может быть использован только один раз. Злоумышленнику было бы интересно узнать i−1, так как этот пароль будет использован для следующей аутентификации. Однако для этого потребуется инвертировать хеш-функцию, которая произвела i−1, используя i (H(i−1) = i), что чрезвычайно сложно сделать с современными криптографическими хеш-функциями. Тем не менее, S/KEY уязвима для атаки «человек посередине», если используется самостоятельно. Она также уязвима к определенным гонкам данных, например, когда вредоносное ПО злоумышленника перехватывает сетевой трафик для определения первых N−1 символов пароля (где N — длина пароля), устанавливает собственное TCP-соединение с сервером и быстро перебирает все возможные символы в N-й позиции, пока не будет найден верный. Эти уязвимости можно избежать, используя ssh, SSL, SPKM или другие зашифрованные транспортные уровни. Поскольку каждая итерация S/KEY не включает соль или счетчик, можно напрямую находить коллизии, не взламывая исходный пароль. Это имеет сложность 264, которую можно предварительно вычислить, используя аналогичный объем памяти. Объем используемой памяти можно оптимизировать, сохраняя цепочки значений, хотя коллизии могут снизить эффективность этого метода, особенно для длинных цепочек. Злоумышленник, имеющий доступ к базе данных S/KEY, может взломать все записи параллельно с той же сложностью 264. Хотя он и не получит исходный пароль, он сможет найти действующие учетные данные для каждого пользователя. В этом отношении это похоже на хранение 64-битных хешей без соли для надежных и уникальных паролей. Протокол S/KEY может образовывать цикл. Если в цепочке S/KEY образуется такой цикл, злоумышленник может использовать ключ пользователя, не найдя исходного значения, и, возможно, не оповестив законного пользователя. Патологическим случаем является OTP, который хешируется сам в себя.

Удобство использования

Внутренне S/KEY использует 64-битные числа. Для удобства использования человеком каждое число преобразуется в шесть коротких слов, каждое из которых содержит от одного до четырех символов, взятых из общедоступного словаря, насчитывающего 2048 слов. Например, одно 64-битное число может быть представлено как "ROY HURT SKI FAIL GRIM KNEE".