Введение
Система одноразовых паролей 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 постепенно выходит из употребления. В то же время, схемы, реализующие двухфакторную аутентификацию, становятся все более популярными.
S/KEY is a one time password system developed for authentication to Unix like operating systems, especially from dumb terminals or untrusted public computers on which one does not want to type a long term password. A user's real password is combined in an offline device with a short set of characters and a decrementing counter to form a single use password. Because each password is only used once, they are useless to password sniffers. Because the short set of characters does not change until the counter reaches zero, it is possible to prepare a list of single use passwords, in order, that can be carried by the user. Alternatively, the user can present the password, characters, and desired counter value to a local calculator to generate the appropriate one time password that can then be transmitted over the network in the clear. The latter form is more common and practically amounts to challenge–response authentication. S/KEY is supported in Linux (via pluggable authentication modules), OpenBSD, NetBSD, and FreeBSD, and a generic open source implementation can be used to enable its use on other systems. OpenSSH also implements S/KEY since version OpenSSH 1.2.2 was released on December 1, 1999. One common implementation is called OPIE. S/KEY is a trademark of Telcordia Technologies, formerly known as Bell Communications Research (Bellcore). S/KEY is also sometimes referred to as Lamport's scheme, after its author, Leslie Lamport. It was developed by Neil Haller, Phil Karn and John Walden at Bellcore in the late 1980s. With the expiration of the basic patents on
public key cryptography and the widespread use of laptop computers running SSH and
other cryptographic protocols that can secure an entire session, not just the password, S/KEY is falling
into disuse. Schemes that implement two factor authentication, by comparison, are growing in use.
Аутентификация
После генерации паролей у пользователя есть лист бумаги с n паролями. Если n очень велико, то хранение всех n паролей или вычисление заданного пароля из H(W) становятся неэффективными. Существуют методы для эффективного вычисления паролей в требуемом порядке, используя только одно хеш-вычисление за шаг и храня небольшое количество паролей. В идеале, хотя на практике это встречается реже, пользователь может иметь с собой небольшое, портативное, безопасное, не подключенное к сети вычислительное устройство, способное восстанавливать любой необходимый пароль, зная секретную фразу, соль и количество итераций хеширования, причем последние два параметра удобно предоставляет сервер, запрашивающий аутентификацию для входа в систему. В любом случае, первый пароль будет таким же, как и тот, что хранится на сервере. Этот первый пароль не будет использоваться для аутентификации (пользователь должен вычеркнуть этот пароль на листе бумаги), вместо него будет использован второй: пользователь предоставляет серверу второй пароль из списка и вычеркивает его. Сервер пытается вычислить H(i), где i – предоставленный пароль. Если H(i) выдает первый пароль (тот, который хранится на сервере), то аутентификация успешна. Сервер затем сохранит i в качестве текущей ссылки. Для последующих аутентификаций пользователь будет предоставлять i. (Последний пароль в напечатанном списке, n, является первым паролем, сгенерированным сервером, H(W), где W – исходный секрет). Сервер вычислит H(i) и сравнит результат с i-1, который хранится на сервере в качестве ссылки.
The user provides the server with the second password on the list and scratches that password. The server attempts to compute H , where is the password supplied. If H produces the first password (the one the server has stored), then the authentication is successful. The server will then store as the current reference. For subsequent authentications, the user will provide i. (The last password on the printed list, n, is the first password generated by the server, H(W), where W is the initial secret). The server will compute H(i) and will compare the result to i−1, which is stored as reference on the server.
Безопасность
Безопасность 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".