Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #58, СЕНТЯБРЬ 2005 г.

Сделай это безопасным!

Alek Silverstone

Спецвыпуск: Хакер, номер #058, стр. 058-072-5


Для того чтобы объяснить сообщения этого протокола, нужно ввести понятия мандата и удостоверения. Мандат – это особое сообщение, которое удостоверяет право клиента обратиться к серверу, используется для безопасной передачи идентификатора клиента серверу. Мандат для объектов a и b определяется так (знак "+" означает стыковку):

М(a,b):=b+Шифровать(a+IP_a+dT+С(a,b), К_b)

Обозначения a и b – имена объектов, IP_a – IP-адрес объекта a, dT – срок действия мандата, С(a,b) – сеансовый ключ для a и b, К_b – секретный ключ b. Видно, что объект a не может расшифровать мандат (он не знает секретного ключа объекта b), но способен передать его в неизменном виде. Мандат может быть использован много раз, пока не истечет срок его действия. Удостоверение – это приложение к мандату. Оно определяется так:

У(a):=a+IP_a+t

где t – временная метка. В отличие от мандата, удостоверение используется только один раз, именно для этого и используется метка времени.

Теперь перейдем к самому протоколу. На первом шаге клиент отсылает Церберу открытое сообщение, содержащее имя клиента и имя нужной TGS.

Клиент –> Цербер: имя_клиента+имя_TGS

Цербер ищет в своей базе данные о клиенте и сравнивает IP-адрес отправителя с адресом, хранящимся в базе. Если они совпадают, служба генерирует сеансовый ключ, который будет использоваться при обмене между клиентом и TGS, и шифрует его секретным ключом клиента. Затем Цербер генерирует для клиента разрешение на выделение мандата (а оно и является мандатом), доказывающее TGS подлинность клиента. Оба сообщения отсылаются:

Цербер –> Клиент: Шифровать(С(клиент, TGS), К_клиент)

Цербер -> Клиент: М(клиент, TGS)

Не забудем, что основная часть мандата зашифрована секретным ключом TGS. Клиент расшифровывает первое сообщение своим секретным ключом и получает сеансовый ключ для связи с TGS.

На следующем этапе клиенту требуется получить отдельный мандат для связи с нужным ему сервером, который он может получить у TGS. Он составляет удостоверение и шифрует его полученным на предыдущем шаге сеансовым ключом TGS. Также он передает имеющийся у него мандат на выделение мандата в неизменном виде:

Клиент -> TGS: Шифровать(У(клиент), С(клиент, TGS))

Клиент -> TGS: М(клиент, TGS)

TGS, получив запрос, расшифровывает мандат своим секретным ключом. Затем, используя включенный в мандат сеансовый ключ, расшифровывает удостоверение клиента. Наконец, TGS проводит три проверки:

1. Сравнивает имя в удостоверении с именем в мандате.

2. Сравнивает временную метку в удостоверении со сроком действия мандата и с текущим временем.

3. Сравнивает IP-адрес в удостоверении с IP-адресом в мандате и IP-адресом отправителя сообщения.

Если все проверки прошли, TGS генерирует мандат доступа клиента к нужному ему серверу. Также служба генерирует сеансовый ключ для клиента и сервера, зашифровывает сеансовым ключом клиента еще и себя, отправляет сообщение клиенту.

Назад на стр. 058-072-4  Содержание  Вперед на стр. 058-072-6