Сделай это безопасным! 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 генерирует мандат доступа клиента к нужному ему серверу. Также служба генерирует сеансовый ключ для клиента и сервера, зашифровывает сеансовым ключом клиента еще и себя, отправляет сообщение клиенту. |