Диффи-Хеллман в Silverlight - PullRequest
       25

Диффи-Хеллман в Silverlight

3 голосов
/ 23 апреля 2010

Я пытаюсь разработать схему безопасности для шифрования данных уровня приложения между клиентом silverlight и созданным мной веб-сервисом php. Поскольку я имею дело с общедоступным веб-сайтом, информация, которую я извлекаю из службы, является общедоступной, но информация, которую я предоставляю веб-службе, не является общедоступной. Для администрирования веб-сайта также имеется серверная часть, поэтому, естественно, все данные приложения, которые передаются и передаются из веб-службы в серверную часть Silverlight, также должны быть зашифрованы.

Silverlight не поддерживает асимметричное шифрование, которое будет работать для общедоступного веб-сайта. Симметричное шифрование будет работать только на серверной части, поскольку пользователи не заходят на общедоступный веб-сайт, поэтому ключи на основе пароля не могут быть получены. Тем не менее, симметричное шифрование было бы неплохо, но я не могу безопасно сохранить закрытый ключ в клиенте Silverlight. Потому что он должен быть либо жестко закодирован, либо прочитан из какого-либо файла конфигурации. Ничто из этого не считается безопасным. Итак ... план Б.

Тогда моей последней альтернативой будет реализация алгоритма Диффи-Хеллмана, который поддерживает симметричное шифрование посредством согласования ключей. Однако Диффи-Хеллман уязвим для атак «человек посередине». Другими словами, нет никакой гарантии, что любая из сторон уверена в идентичности друг друга, что делает возможным перехват и изменение связи без ведома принимающей стороны об этом. Таким образом, рекомендуется использовать закрытый общий ключ для шифрования согласования ключей, чтобы подтвердить личность любой из сторон.

Это возвращает меня к моей первоначальной проблеме, которая привела к тому, что мне пришлось использовать Диффи-Хеллмана, как я могу использовать закрытый ключ в клиенте silverlight без жесткого кодирования его ни в коде, ни в файле XML.

Я совершенно не влюблен в этот вопрос ... есть ли ответ на этот вопрос?

EDIT:

Помните, что речь идет о пользовательском веб-сервисе PHP, который я развернул самостоятельно.

Я нашел реализацию RSA, которую я могу использовать в Silverlight. Кажется, довольно безопасно использовать это для шифрования рукопожатия для соглашения о ключе DiffieHellman между клиентом Silverlight и веб-сервисом PHP, а затем также использовать его для шифрования согласованного симметричного ключа (который сам генерируется из результата ключа обменяю хешированием).

После этого я в значительной степени гарантирую, что вся информация , поступающая на веб-службу, не была перехвачена, изменена и затем повторно передана (MITM). Однако я верю, что это все еще возможно; технически, чтобы злоумышленник выдавал себя за клиента Silverlight и отправлял сообщения веб-службе (при условии, что он обнаружил URL).

Обеспечивается защита от несанкционированного доступа, поскольку злоумышленник не знает «секретного API» моего пользовательского веб-сервиса, поэтому он не может связаться с ним.

Единственный способ сломать это состоит в том, чтобы перебить веб-сервис грубой силой с помощью любых строк, которые злоумышленник может счесть действительными, чтобы попытаться получить ответ от веб-службы. Я не думаю, что вы можете перебор строки переменной длины. Звучит непрактично.

Кто-нибудь видит проблему с таким подходом?

Ответы [ 3 ]

3 голосов
/ 23 апреля 2010

SSL / TLS страдает от той же проблемы, что и любая реализация на основе Диффи-Хеллмана, с которой вы столкнетесь, в том, что она все еще может быть сломана атакой "человек посередине".

Причина, по которой TLS является безопасным и надежным, заключается в том, что клиент при получении сертификата сервера аутентифицирует его, проверяя, что он подписан другим сертификатом с известной доверенной идентификацией, например, VeriSign. До сих пор это делает невозможным проведение атаки «человек посередине» без ключа VeriSign private - когда нарушитель отправляет поддельный сертификат, объявляющий сервер, клиент может легко обнаружить, что это сертификат не подписан с использованием сертификата доверенного удостоверения и выдает соединение, отображая предупреждение для пользователя.

Для ваших целей, вероятно, проще всего использовать TLS. Чтобы сделать его безопасным, вы должны сгенерировать сертификат для своего сервера, а затем встроить в свой клиент открытый ключ для этого сертификата. Затем клиент может проверить, что он общается с вашим сервером, без необходимости раскрывать закрытый ключ, который вы * не должны распространять.

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий к ответу Джерри, если ваш хостинг-провайдер вообще не разрешает соединения SSL / TLS, предотвращение атаки "человек посередине" будет непростым делом. Если это ваша единственная причина избегать TLS, я бы посоветовал вашему провайдеру включить его или найти провайдера, который позволяет это.

РЕДАКТИРОВАТЬ: В ответ на ваш отредактированный вопрос: даже если вы сейчас используете RSA в своем клиенте Silverlight для отправки данных в веб-службу, вы не можете гарантировать, что клиент сам не был изменен. Злоумышленник вполне может заглянуть в ваш клиент, определить алгоритм, который вы используете для выполнения шифрования / рукопожатия, а затем написать код для олицетворения вашего клиента (или, действительно, изменить клиент так, чтобы он включал свой код). Как только они это сделают, они могут начать анализировать ваш API и использовать его для звонков на ваш веб-сервис.

То же самое с SSL / TLS - клиент может проверять подлинность хоста, используя сертификат хоста, и до тех пор, пока сервер хоста защищен, клиент может доверять выводу хоста; однако не существует механизма, в котором хост может на 100% проверить, что клиент является тем, кем они себя называют, поскольку клиент будет работать на компьютере, на котором нет контролируемой среды выполнения.

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

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

1 голос
/ 23 апреля 2010

Очевидным решением будет использование WCF для установления соединения SSL или TLS вместо попытки встроить это в приложение.

0 голосов
/ 28 апреля 2010

Я рекомендую начать с этого протокола обмена ключами JavaScript + PHP DH: http://enanocms.org/News:Article/2008/02/20/Diffie_Hellman_key_exchange_implemented

Затем вы можете переписать JavaScript в Silverlight. Я рекомендую использовать Wireshark для выгрузки пакетов, тогда вы можете использовать Meld или что-то еще для сравнения пакетов, чтобы увидеть, чем ваша реализация отличается от оригинала.

Удачи!

(Отказ от ответственности: я полностью согласен с командой разработчиков Enano, это не полная замена SSL, и по возможности следует использовать SSL).

...