SSL / TLS страдает от той же проблемы, что и любая реализация на основе Диффи-Хеллмана, с которой вы столкнетесь, в том, что она все еще может быть сломана атакой "человек посередине".
Причина, по которой TLS является безопасным и надежным, заключается в том, что клиент при получении сертификата сервера аутентифицирует его, проверяя, что он подписан другим сертификатом с известной доверенной идентификацией, например, VeriSign. До сих пор это делает невозможным проведение атаки «человек посередине» без ключа VeriSign private - когда нарушитель отправляет поддельный сертификат, объявляющий сервер, клиент может легко обнаружить, что это сертификат не подписан с использованием сертификата доверенного удостоверения и выдает соединение, отображая предупреждение для пользователя.
Для ваших целей, вероятно, проще всего использовать TLS. Чтобы сделать его безопасным, вы должны сгенерировать сертификат для своего сервера, а затем встроить в свой клиент открытый ключ для этого сертификата. Затем клиент может проверить, что он общается с вашим сервером, без необходимости раскрывать закрытый ключ, который вы * не должны распространять.
РЕДАКТИРОВАТЬ: В ответ на ваш комментарий к ответу Джерри, если ваш хостинг-провайдер вообще не разрешает соединения SSL / TLS, предотвращение атаки "человек посередине" будет непростым делом. Если это ваша единственная причина избегать TLS, я бы посоветовал вашему провайдеру включить его или найти провайдера, который позволяет это.
РЕДАКТИРОВАТЬ: В ответ на ваш отредактированный вопрос: даже если вы сейчас используете RSA в своем клиенте Silverlight для отправки данных в веб-службу, вы не можете гарантировать, что клиент сам не был изменен. Злоумышленник вполне может заглянуть в ваш клиент, определить алгоритм, который вы используете для выполнения шифрования / рукопожатия, а затем написать код для олицетворения вашего клиента (или, действительно, изменить клиент так, чтобы он включал свой код). Как только они это сделают, они могут начать анализировать ваш API и использовать его для звонков на ваш веб-сервис.
То же самое с SSL / TLS - клиент может проверять подлинность хоста, используя сертификат хоста, и до тех пор, пока сервер хоста защищен, клиент может доверять выводу хоста; однако не существует механизма, в котором хост может на 100% проверить, что клиент является тем, кем они себя называют, поскольку клиент будет работать на компьютере, на котором нет контролируемой среды выполнения.
Однако - несмотря на то, что вышеупомянутое верно, и что возможно , что злоумышленник может скомпрометировать вашу систему таким образом, вероятно, не будет вероятным - если вы не работаете над общедоступная система, которая привлекает большое внимание / использование, или система, которая в той или иной форме имеет дело непосредственно с деньгами, злоумышленнику необходимо приложить некоторые усилия, прежде чем он сможет отправить свой собственный вклад в ваш веб-сервис.
Лучше всего тщательно проверить входные данные, полученные вашим веб-сервисом, и не оставлять висячие API доступными, которые ваш постоянный клиент никогда не будет использовать.