Защищать и аутентифицировать данные с сервера на клиент

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

Сначала я думал, что RSA будет решением, но, насколько я понимаю, я хочу использовать его задом наперед: я мог зашифровать данные с помощью открытого ключа на сервере и расшифровать клиенты с помощью закрытого ключа. Это будет работать нормально, за исключением того, что кто-то может получить открытый ключ из закрытого ключа. Это верно? Если так, есть ли альтернативный вариант?

Заранее спасибо.

2 ответа

Решение

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

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

Примечание. Вы отправляете сообщение в виде простого текста, поэтому в этой системе нет конфиденциальности. Этот механизм подписания гарантирует только целостность и подлинность. Если вам также нужна конфиденциальность, вы можете использовать традиционное шифрование для шифрования сообщения вместо его отправки в виде простого текста.

TLS делает такие вещи, поэтому вы можете рассмотреть возможность использования его в качестве канала данных.

Ваше требование - в значительной степени описание учебника односторонней аутентификации в режиме TLS (прежний SSL), также называемой аутентификацией на стороне сервера. По сути, это то, что происходит каждый раз, когда вы находитесь на веб-сайте https.

Но, предполагая, что вы знаете о https, я предполагаю, что вы пытаетесь передать не данные http, а какой-то другой протокол. Вот где сияет TLS: он реализован на транспортном уровне и, следовательно, не зависит от любого протокола данных приложения, вы можете отправлять произвольные данные через зашифрованный / проверенный TLS сокет.

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

Другие вопросы по тегам