Рассмотрим и сценарий клиент-сервер, и у вас будет два варианта:
- Вы можете включить открытый ключ сервера в клиент и выполнить обмен.
- Вы можете использовать алгоритм обмена ключами Диффи-Хеллмана для подтверждения, а затем обмена ключами.
Какой из них более безопасный? также, если открытый ключ поступит из магазина, скажем, из магазина CA клиента? будет ли это более безопасно вместо привязки к клиентскому приложению?
Развертывание будет выполняться с помощью установщика, проверяя версию при каждом запуске.
6 ответов
Не надо.
Если вам нужно решить такую проблему в производственном коде, попросите эксперта сделать это. В криптографии так много тонких ловушек, что вы наверняка проиграете.
При (только) обмене ключами DH клиент не имеет возможности узнать, что это действительно сервер, с которым он разговаривает.
Таким образом, разговор будет защищен от перехватчиков, но кто-то может выдать себя за сервер и скомпрометировать клиента.
Встроенный ключ можно заменить. Вообще говоря, если клиентская машина не защищена непрограммными средствами, вы не сможете предотвратить взлом вашего клиента достаточно мотивированным злоумышленником. Даже TPM
является нет панацеи. Вопрос превращается в компромисс: количество человеко-часов злоумышленников и полезность (прибыль, известность и т. Д.). Единственный действительно безопасный способ лицензировать программу, которая выполняет вычисления, - это выполнять все лицензируемые вычисления на сервере, который вы физически контролируете; https
или SSL
можно сделать достаточно безопасными, выбрав соответствующую длину ключа, схемы хеширования, шифры и т. Д. (Предмет, о котором я мало знаю).
Принцип здесь на самом деле довольно прост: вам нужно спроектировать ситуацию, в которой в интересах ваших клиентов будет защита их паролей / лицензионных ключей / данных / чего угодно. Например. Если у вас есть вычислительный сервер и вы взимаете с клиентов плату за серверное время, клиентские ключи являются прокси для банковских счетов владельцев.
В сценарии с открытым ключом клиент должен генерировать ключ, вы не можете быть уверены, что этот ключ надежно сгенерирован (кто-то может получить доступ к системе и изменить генератор ключей, чтобы всегда использовать одно и то же значение, увеличить предыдущее значение на единицу, в любом случае, указанный злоумышленник может потерять ваши коммуникации навсегда). Шифрование с открытым ключом не предназначалось для этой цели.
Диффи-Хеллман был бы лучше, но, как сказал Тобиас, если вы бросите свой собственный, вы, вероятно, оставите атаку.
Что ж, алгоритмы с закрытым ключом обычно предлагают лучшую производительность (на порядок или больше, насколько я помню), чем их аналог с открытым ключом. В этом смысле Диффи-Хеллман был бы более эффективным, чем, скажем, RSA для архитектуры клиент-сервер.
Если у вас гораздо больше клиентов, чем серверов, вы можете реализовать алгоритм с открытым ключом, чтобы уменьшить обмены между ними.
Тем не менее, как многие говорили, вам следует подумать о том, чтобы спросить / нанять эксперта по этому вопросу, поскольку существует множество различных типов атак (большинство из них нацелены только на реализацию, а не на алгоритм как таковой). Если вы все же хотите продолжить, я могу только пожелать вам удачи и указать вам ресурсы, которые вы должны очень внимательно прочитать.
Метод согласования ключей Диффи-Хеллмана
Как упоминал выше Тобиас, лучше не использовать собственный протокол. Я бы предложил использовать реализацию TLS или, по крайней мере, смоделировать ваш протокол на TLS. TLS предоставляет варианты обмена ключами как на основе Диффи-Хеллмана, так и на основе сертификатов.
Взгляните на: http://en.wikipedia.org/wiki/Secure_Sockets_Layer
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .