Вопрос к "папе Карло" и не только.

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
Аман Ванкуверский
Маньяк
Сообщения: 2759
Зарегистрирован: 18 окт 2005, 01:10

Сообщение Аман Ванкуверский »

В принципе ajkj2em уже все сказал.
vg писал(а):Об имплементации кратко. Она чрезвычайно проста и тупа:
1) Клиент посылает: username (как есть); challenge_1 (случайная последовательность байт. Далее клиент будет ждать ответа от сервера на отправленный challenge_1 );
2) Сервер получив данные username; challenge_1 вычисляет:
- выбирает из базы сохранённый hPwd;
- создаёт последовательность bytes = challenge_1 + hPwd;
- вычисляет "ответ" hash_1 = hash( bytes) на challenge_1;
- создаёт для клиента свой challenge_2 (случайная последовательность байт);
3) Сервер посылает клиенту ответ на его challenge в виде hash_1, и при этом посылает свой challenge_2;
4) Клиент сверяет полученный hash_1 с расчитываемым по challenge_1 и userpassword;
Если hash_1 != hash (challenge_1 + hash(userpassword) ), то это не "наш" сервер. Тогда заканчиваем. Иначе выполняем п.5.
5) Клиент вычисляет hash_2 = hash (challenge_2 + hash(userpassword)), и отсылает его серверу в ответ на challenge_2.
6) Сервер сравнивает полученный hash_2 с аналогичным значением, вычисленным с использованием сохранённого в базе hPwd: hash_2_srv = hash( challenge_2 + hPwd )
7) Если hash_2_srv == hash_2, то сервер, считает, что это "наш" клиент...
Ничего не защищает от M-i-t-M.
vg писал(а):7) Если hash_2_srv == hash_2, то сервер, считает, что это "наш" клиент, и ждёт получения "полезной" команды от клиента , которую и выполняет. Затем сервер разрывает соединение.
а это просто сводит на нет весь смысл предыдущих шагов. Надо саму команду шифровать двумя ключами. Но это и есть тот же IKE. Так что, как уже было сказано, как ни крутите,
ajkj2em писал(а):в результате все равно получится либо SSL, либо IKE/ESP :)
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Аман Ванкуверский писал(а): Ничего не защищает от M-i-t-M.
от тривиального MnM их протокол защищен. но только от него ..
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

ajkj2em писал(а): за счет того что hash_1 и hash_2 имеют одинаковую структуру,
man in the middle может заставить клиента посчитать hash для
произвольного challenge, что можно использовать для того, чтобы
посчитать клиентский authentication hash в другой сессии ..
Не так просто. Клиент не будет отвечать серверу, если сервер не пройдёт проверку подлинности. Сервер проверяется первым, п.3.
7) Если hash_2_srv == hash_2, то сервер, считает, что это "наш" клиент, и ждёт получения "полезной" команды от клиента , которую и выполняет. Затем сервер разрывает соединение.

.. и man in the middle аккуратно подменяет команду в реквесте на нужную
Пофиксено, в новой версии, см. ниже (вернее вернулся к той версии которая была в самом начале, ещё более упрощённой в сравнении с тем, что ниже)
tcp stream должен быть пакетизирован,
все пакеты должны быть пронумерованы и "подписаны",
Да это сделано. Протокол прехедед. Последовательность пакетов строго учитывается. В тпц пакуется прехедед "транспортный" кастом протокол прикладного уровня. Там команды, длины и офсеты, контрольная сумма передаваемых данных + .... В него пакуется прехедед протокол проверки подлинности, там тоже длины и оффсеты + данные. Может показаться навороченным (протокол лейр в протокол лейр), но на самом деле очень гибко. Я использовал это давно для других целей. Так, что переписывать пришлось почти ничего.
не надо изобретать велосипед
Согласен. Хотя, есть одно маленькое "но". В данном протоколе полностью отсутствуют криптографические методы. Всё открыто. Ничего не шифруется. В некоторых обстоятельствах может оказаться большим плюсом.

======

Вот немного упростил... Как и было ранее, сервер может определить из БД сохранённый hash (userpasswod) hPwd для username. Клиент его вычисляет hPwd.

1) Клиент посылает:
- username (как есть);
- challenge_1 (случайная последовательность байт)

Клиент хочет первым проверить подлинность сервера, чтоб сервер ответил на clallenge_1 значением hash_1 = hash ( clallenge_1 + hPwd ). Если клиент не получит такого результата, то соединение будет им завершено.

2) Сервер получив данные username и challenge_1 выполняет следующее:
- вычисляет "ответ" hash_1 = hash( challenge_1 + hPwd ) на challenge_1 клиента;
- создаёт для клиента свой challenge_2 (случайная последовательность байт);
- посылает клиенту ответ на его challenge_1 в виде hash_1, и при этом посылает свой challenge_2;

Сервер делает две вещи. Он отвечает клиенту на clallenge_1 значением hash_1. Одновременно он просит клиента, в свою очередь, подтвердить подлинность ответом на challenge_2.
Сервер хочет, чтоб клиент ответил ему на clallenge_2 значением hash_2 = hash ( clallenge_2 + hPwd ). Если он не получит такого результата, то соединение будет завершено сервером.

3) Клиент проверяет подлинность сервера. Он сверяет полученный от сервера hash_1 со значением, рассчитываемым по challenge_1 и userpassword. Если ожидания клиента по п.1. не выполнены, т.е. если hash_1 != hash (challenge_1 + hPwd), то это не "наш" сервер. Тогда заканчиваем. Иначе клиент готовит “полезную команду”, п.4.

4) Клиент готовит и отправляет пакет серверу:
- вычисляет hash_2 = hash (challenge_2 + hPwd) (это удостоверение подлинности клиента для сервера);
- включает в пакет несекретные коды команд серверу, который сервер будет выполнять (полезные команды).
- вычисляет контрольную сумму, которую включает в заголовок пакета. Контрольная сумма рассчитывается по значению последовательности байт всего пакета (заголовков и команд) + hash_1 + hPwd, которые потом отбрасываются перед отправкой.

5) Сервер сравнивает полученный hash_2 с вычисляемым значением hash_2_srv = hash( challenge_2 + hPwd ) . Это будет служить проверкой подлинности клиента. Если hash_2_srv == hash_2, то сервер, считает, что это "наш" клиент. Иначе сервер закрывает соединение. Далее от проверяет контрольную сумму, добавляя к полученному пакету сохраненное с начала соединения значение hash_1, и hPwd. Если CRC OK, выполяется команда клиента. CRC должна гарантировать целостность данных.

Спасибо, парни.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

vg писал(а):
ajkj2em писал(а): за счет того что hash_1 и hash_2 имеют одинаковую структуру,
man in the middle может заставить клиента посчитать hash для
произвольного challenge, что можно использовать для того, чтобы
посчитать клиентский authentication hash в другой сессии ..
Не так просто. Клиент не будет отвечать серверу, если сервер не пройдёт проверку подлинности. Сервер проверяется первым, п.3.
ты не понял или недопонял. vulnerability достаточно тривиальное
и лежит на поверхности. объяснять в деталях я смысла особого не
вижу, поскольку ты уже похоже решил что самодельный велосипед
- это то что нужно.

просто keep in mind, что в существующем виде протокол допускает
использование сервера любым клиентом, который сидит на трафике
между аутентичным клиентом и сервером.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

такие вещи делают достаточно просто....

1. хттпс между клиентом и сервером. 128 бит.
2. каждый пользователь имеет логин и пароль. и то и то хранится в базе. пароль хранится в виде хеша расчитанного скажем 256 битным ключем.
3. при логине клиент посылает логин пароль, хешуешь пароль сравниваешь с тем что в базе. если совпадает, то выдаешь сешен ИД, уникальный. гуид например и отдаешь его клиенту. все послед. запросы клиент шлет с этим гуидом.
4. при получении запроса по гуиду ищешь пользовательский ИД итд.... все секурно.

удачи!
spavel
Житель
Сообщения: 662
Зарегистрирован: 10 апр 2006, 13:16
Откуда: Coquitlam

Сообщение spavel »

Делай one way encoding пасворда в клиенте о таким же образом на сервере, сравнивай. Для усиления кодировки можно использовать время (но его тоже надо будет передавать) Канал при этом может бытл не защищен вообще. Т.е. в базе лежит открытый пасворд на каждого юзера клиента и кодируется он алгоритмом (много разных есть) в зависимости от времени присланного клиентом.
spavel
Житель
Сообщения: 662
Зарегистрирован: 10 апр 2006, 13:16
Откуда: Coquitlam

Сообщение spavel »

папа Карло, я бы кодированны пароль в базе не хранил - могут залезть именно в базу. лучше вживую считать и переодически клиентам новый алгоритм кодировки подгружать.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

spavel писал(а):папа Карло, я бы кодированны пароль в базе не хранил - могут залезть именно в базу. лучше вживую считать и переодически клиентам новый алгоритм кодировки подгружать.
не прав. после того как хакер залезет в базу он увидит хеши (пароли зашифрованые в одну сторону). без возможности востановления в обратную сторону. хешировать пароли на стороне клиента, собственно как и произведение любых действий на обеспечение безопасности систему мягко говоря не верно.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

папа Карло писал(а):такие вещи делают достаточно просто....

1. хттпс между клиентом и сервером. 128 бит.
2. каждый пользователь имеет логин и пароль. и то и то хранится в базе. пароль хранится в виде хеша расчитанного скажем 256 битным ключем.
3. при логине клиент посылает логин пароль, хешуешь пароль сравниваешь с тем что в базе. если совпадает, то выдаешь сешен ИД, уникальный. гуид например и отдаешь его клиенту. все послед. запросы клиент шлет с этим гуидом.
4. при получении запроса по гуиду ищешь пользовательский ИД итд.... все секурно.

удачи!
Изящно.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

ajkj2em писал(а):
vg писал(а):
ajkj2em писал(а): за счет того что hash_1 и hash_2 имеют одинаковую структуру,
man in the middle может заставить клиента посчитать hash для
произвольного challenge, что можно использовать для того, чтобы
посчитать клиентский authentication hash в другой сессии ..
Не так просто. Клиент не будет отвечать серверу, если сервер не пройдёт проверку подлинности. Сервер проверяется первым, п.3.
ты не понял или недопонял. vulnerability достаточно тривиальное
и лежит на поверхности. объяснять в деталях я смысла особого не
вижу, поскольку ты уже похоже решил что самодельный велосипед
- это то что нужно.

просто keep in mind, что в существующем виде протокол допускает
использование сервера любым клиентом, который сидит на трафике
между аутентичным клиентом и сервером.
Про уязвимость и велосипед понятно. Ещё справедливости ради надо добавить, что этот самопальный потокол достаточно близок к идеям MS CHAP. И всё же, если скажут делать, то буду делать SSL. Появились причины. Возможно только, оставлю пока, как есть, в тестовом варианте всего проекта, пока батьки будут думать.

Спасибо за анализ.

ПС. Думаю, стал бы делать SSL уже после первого постинга мармота... То была как бы последняя капля. :lol: Всегда надо, чтобы её кто-нить капнул. :lol:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

папа Карло писал(а):
spavel писал(а):папа Карло, я бы кодированны пароль в базе не хранил - могут залезть именно в базу. лучше вживую считать и переодически клиентам новый алгоритм кодировки подгружать.
не прав. после того как хакер залезет в базу он увидит хеши (пароли зашифрованые в одну сторону). без возможности востановления в обратную сторону. хешировать пароли на стороне клиента, собственно как и произведение любых действий на обеспечение безопасности систему мягко говоря не верно.
2папа + spavel,
Проста шутка. Если уж залезли в базу, то ни хеши, ни пароли больше не понядобятся.
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

Кстати, если делать нормальный SSL client authentication, то никакие пароли не нужны...
Хотя конечно свою маленькую certificate authority придётся делать :)
А если ещё вот такую штуку прикрутить http://www.safenet-inc.com/products/tokens/ikey2032.asp то вообще круто будет... Эх, было время, когда я этим занимался... :)
Ответить