Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.05;
Скачать: CL | DM;

Вниз

Противодействие активному перехвату открытых ключей   Найти похожие ветки 

 
xayam ©   (2010-06-11 17:47) [0]

http://ru.wikipedia.org/wiki/Файл:Криптосистема_с_открытым_ключом_и_активным_перехватчиком.png

В этой модели Ева перехватывает открытый ключ e, посланный Бобом Алисе. Затем создает пару ключей e" и d", «маскируется» под Боба, посылая Алисе открытый ключ e", который, как думает Алиса, открытый ключ, посланный ей Бобом. Ева перехватывает зашифрованные сообщения от Алисы к Бобу, расшифровывает их с помощью секретного ключа d", заново зашифровывает открытым ключом e Боба и отправляет сообщение Бобу. Таким образом, никто из участников не догадывается, что есть третье лицо, которое может как просто перехватить сообщение m, так и подменить его на ложное сообщение m". Это подчеркивает необходимость аутентификации открытых ключей. Для этого обычно используют сертификаты.

Можно ли обойтись без третьей стороны, подписывающей сертификат?
В примерно таком протоколе обмена между сервером и клиентом на основе xml, где открытые сеансовые ключи уязвимы:

<message>

<key>Передача открытого ключа от клиента к серверу (сразу после подключения, иначе от сервера вернется ошибка type=1) и от сервера клиенту (сразу после получения сервером ключа игрока);
         После такого обмена ключами взаимодействие должен осуществляться через тег crypt(body, signature), остальные теги нужно игнорировать.
         Содержимое тега body всегда подписывается цифровой подписью, которая создается с помощью закрытого ключа Отправителя и помещается в тег signature.
         После этой операции содержимое тега crypt шифруется открытым ключом Сервера при передаче данных на Сервер от Клиента и открытым ключом Клиента при передаче с Сервера.
         После этого Получатель должен:
          1) расшифровать содержимое тега crypt с помощью своего закрытого ключа.
          2) выполнить проверку соответствия содержимого тега body и его цифровой подписи в теге signature
              TRUE. Если проверка прошла успешно, то Получатель должен обработать все запросы query от Оправителя, описанные в теге body, и отослать Отправителю ответы в теге answer,
                                                                           то Клиент должен дополнительно обработать все события, описанные в теге event.
              FALSE. Если проверка не удалась, то Сервер должен отослать Клиенту ошибку type=2
</key>
<error type="1">Нужно указать Ваш открытый ключ!</error>
<error type="2">Содержимое тега body не соответствует цифровой подписи! Возможно сообщение было искажено при передачи по сети.</error>

<crypt>

 <body>
            <answer id="ID запроса" type="getrooms | ">
    <error type="0 - ОК (запрос успешно выполнен);
                       1 - нужен тег key (при передаче открытого ключа);
                       2 - cодержимое тега body не соответствует цифровой подписи! Возможно сообщение было искажено при передачи по сети.
                       3 - Неправильная структура тега query;
                       4 - в теге login допускается использование только латинских букв, тире, подчеркивания и цифр;
                       5 - обнаружен пустой тег (login и/или password и/или email, если он должен быть указан);
                       ...">
              Описание ошибки
          </error>
          <rooms>Ответ на запрос getrooms
             <room id="ID комнаты1">Название комнаты1</room>
             <room id="ID комнаты2">Название комнаты2</room>
             <room id="ID комнаты..">Название комнаты..</room>
             <room id="ID комнатыN">Название комнатыN</room>
          </rooms>
   </answer>
   <query id="ID запроса, формируется отправителем" type="newplayer | remindpassword | logon | getrooms">
   <newplayer>
    <login>Логин (латинские буквы, тире, подчеркивание, цифры)</login>
    <password>Пароль</password>
    <name>Фамилия Имя Отчество</name>
    <email>Электронная почта (необязательный тег, необходимо указать, если хотите иметь возможность восстанавливать пароль и/или получать уведомления от администрации сервера)</email>
    <birthday>ГГГГ.ММ.ДД (необязательный тег)</birthday>
    <description>Дополнительная информация о пользователе</description>
   </newplayer>
   <remindpassword>Восстановление утерянного пароля на email
       <login>Логин (латинские буквы, тире, подчеркивание, цифры)</login>
    <email>Электронная почта</email>
   </remindpassword>
   <logon>Вход на сервер
       <login>Логин (латинские буквы, тире, подчеркивание, цифры)</login>
    <password>Пароль</password>
   </logon>
   
   </query>
   <event type="">События, передаваемые от сервера клиенту при игре или входе/выходе в/из комнату/ы игрока
            </event>
 </body>
 
 <signature>Цифровая подпись тела сообщения (содержимое тега body), создается с помощью закрытого ключа Отправителя</signature>
 
</crypt>

</message>

Клиент и Сервер имеют открытый исходный код.


 
Empleado ©   (2010-06-11 18:05) [1]

Аппараты Watchuard давно позволяют читать https траффик, активно работая с сертификатами.
Принцип немного другой, зато кайф :)

А в чем вопрос-то?


 
Kerk ©   (2010-06-11 18:09) [2]


> Empleado ©   (11.06.10 18:05) [1]
>
> Аппараты Watchuard давно позволяют читать https траффик,
>  активно работая с сертификатами.

А как?


 
xayam ©   (2010-06-11 18:13) [3]


> Empleado ©   (11.06.10 18:05) [1]
>  активно работая с сертификатами.
> А в чем вопрос-то?

как обойтись без сертификатов?


 
xayam ©   (2010-06-11 18:16) [4]

т.е. как проверить, что открытый ключ пришел именно от того пользователя, который знает пару login/password для доступа к серверу, без использования сертификатов.


 
xayam ©   (2010-06-11 18:32) [5]

скорей даже не так, у меня немного неправильно xml написан. Тут проблема в проверке того, принадлежит ли открытый ключ к подключаемому серверу (если сначала отсылается открытый ключ с сервера на клиент, потом ответ от клиента - его открытый ключ, который можно зашифровать серверным). Но серверный ключ уязвим по ходу дела.


 
Медвежонок Пятачок ©   (2010-06-11 20:15) [6]

Можно ли обойтись без третьей стороны, подписывающей сертификат?

Можно обойтись, если система закрытая.
Например серверным сертификатом подписывем клиентские.
Сервер принимает только тех клиентов, у кого  ишьюером сертификата является сервер.

Третья сторона в этом случае не нужна.

Сервер верит только тем клиентам, в которых уверен.
А клиент либо доверяет серверу, либо не работает с ним.


 
xayam ©   (2010-06-11 22:30) [7]

а исходники нельзя подписать серверным сертификатом?


 
Медвежонок Пятачок ©   (2010-06-11 22:42) [8]

в каком смысле подписать исходники?


 
Медвежонок Пятачок ©   (2010-06-11 22:51) [9]

по приведенной цитате из педивикии описано нечто иное. там описан не сам сеанс а момент когда издателю сертификата приходит запрос на выпуск сертификата как бы от Алисы, но на самом деле от третьего лица.

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

третье лицо перехватывает запрос посередине и заменяет его своим.
в новом запросе на сертификат (сделанным третим лицом) написано, что сертификат запрашивает как бы алиса. Но паблик кей там не алисы, а третьего лица.

Если боб повелся на этот запрос и выпустит сертификат на основе поддельного запроса, то получится следующее:

у третьего лица ест его приватный ключ и сертификат в котором написано, что он принадлежит алисе. Причем паблик и приват ключи бьют меж собой.

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


 
xayam ©   (2010-06-11 23:00) [10]


> Медвежонок Пятачок ©   (11.06.10 22:42) [8]
> в каком смысле подписать исходники?

вот допуcтим такая ситуация. Сервер и Клиент пишет одна организация. Весь код и Сервера, и Клиента выкладывает для всех, не ограничивая его использование/изменение/распространение. НО. Если с помощью клиента пользователь подключается к исходному Серверу этой самой организации (теоретически программу можно установить на любой сервер), то у Сервера организации появляется такая задача-проблема: определить с помощью его исходников идет подключение или нет (исходники изменены/переписаны с нуля)? Вот для этого в принципе и нужно как-то "подписать" исходники (php)

> там описан не сам сеанс а момент когда издателю сертификата
> приходит запрос на выпуск сертификата

это ты где вычитал такое?


 
Медвежонок Пятачок ©   (2010-06-11 23:08) [11]

это ты где вычитал такое?

я не вычитал, я не теоретик.
я лет 10 как проектирую подобные системы.
и до сих пор ни одной осечки не было.

если сервер и клиент самописный, и серверная сторона занимается выпуском клиентских сертификатов, то проблемы вообще нет.

главное для вас - это принять запрос на выпуск клиентского сертификата от того, кто действительно является тем, на кого выпускается сертификат.

когда дойдет дело до информационного обмена, то на сервер придет посылка зашифрованная в адрес сервера и подписанная клиентом.

из этой посылки тебе будет доступно:
- имя издателя клиентского сертификата
- отпечаток (хеш) сертификата издателя.
- имя владельца и отпечаток клиентского сертификата.

этого достаточно чтобы убедится, что автор посылки обладает сертификатом, который был выпущен сервером.


 
xayam ©   (2010-06-11 23:19) [12]


> Медвежонок Пятачок ©   (11.06.10 23:08) [11]
> я не вычитал, я не теоретик.
> я лет 10 как проектирую подобные системы.
> и до сих пор ни одной осечки не было.
> Медвежонок Пятачок ©   (11.06.10 22:51) [9]
> по приведенной цитате из педивикии описано нечто иное. там
> описан не сам сеанс а момент когда издателю сертификата
> приходит запрос на выпуск сертификата

????

> если сервер и клиент самописный, и серверная сторона занимается
> выпуском клиентских сертификатов, то проблемы вообще нет.

вот по поводу сертификатов можно подробнее (или где хорошо описано) описать весь процесс от подачи заявки на сертификат до проверки подлинности клиента сервером, я пока в это не очень хорошо въехал.


 
Медвежонок Пятачок ©   (2010-06-11 23:31) [13]

ну фик знает как объяснить.

стоит допустим сервер.
если я не легитимный участник системы, но у меня есть сертификат сервера, то я смогу зашифровать данные в адрес его, и сервер благополучно их примет и расшифрует.

если данные при этом не подписаны, то сервер без понятия кто именно является автором этих данных.

если же данные подписаны, то :
сервер проверяет эцп и делает вывод о их целостности.

Если я (нелегитимный участник) подпишу данные, то сервер все равно сможет проверить эцп и проверка ему скажет, что все ок. (данные после их подписания мной никем не изменялись)

Но этого тоже мало.

Допустим я еще спер логин и пароль у легального участника системы.
Формирую посылку серверу, указываю логин и пароль.

Сервер расшифрует посылку, проверит эцп, получит логин и пароль.
И все будет в норме как и у любого другого участника системы.

Но если сервер посмотрит данные сертификата которым все это было подписано, то он увидит что:

1. отпечаток моего сертификата не тот, что прописан в свойствах юзера с переданным мной краденым логином

2. издатель моего левого сертификата - не сам сервер. (у меня не может быть сертификата, изданного твоим сервером, если только я не спер еще и приватный ключ сервера)

вот типа и все.


 
Медвежонок Пятачок ©   (2010-06-12 00:00) [14]

если точнее, то все еще проще.

я - злоумышленник.
у меня допустим есть :

имя владельца сертификата легитимного участника.
имя владельца серверного сертификата.

я делаю поддельный сертификат, подставляя эти имена в его поля subject и issuer, затем подписываю сертификат своим левым приватным ключом.

сертификат получается формально валидным и очень похожим на подделываемый сертификат, но его отпечаток (поле которое при просмотре сертификата видно на вкладке "состав" и так и называется "отпечаток") совсем другой и отличается от отпечатка настоящего сертификата.

вот по этому-то атрибуту сервер и в состоянии отличить настоящего участника от поддельного.



Страницы: 1 вся ветка

Текущий архив: 2010.09.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.008 c
15-1275828843
Копир
2010-06-06 16:54
2010.09.05
Жизнь на Титане?


3-1244113042
ganda
2009-06-04 14:57
2010.09.05
Работа функцией UDF при вставки записи в Таблицу


2-1276219742
Андрей_1
2010-06-11 05:29
2010.09.05
Видео поток + звук


2-1275919591
harisma
2010-06-07 18:06
2010.09.05
Приколы с AnsiSameText


15-1276031254
Юрий Зотов
2010-06-09 01:07
2010.09.05
Кто знает Висту и семерку - нужна консультация