Защищать и аутентифицировать данные с сервера на клиент
Я хочу отправить данные из серверного программного обеспечения в клиентское программное обеспечение, зашифрованное таким образом, чтобы только сервер (частное программное обеспечение) мог зашифровать эти конкретные данные, но любой клиент может расшифровать их.
Сначала я думал, что RSA будет решением, но, насколько я понимаю, я хочу использовать его задом наперед: я мог зашифровать данные с помощью открытого ключа на сервере и расшифровать клиенты с помощью закрытого ключа. Это будет работать нормально, за исключением того, что кто-то может получить открытый ключ из закрытого ключа. Это верно? Если так, есть ли альтернативный вариант?
Заранее спасибо.
2 ответа
Что вы хотите сделать, это цифровой подписи данных, отправляемых сервером. Все клиенты могут проверить эту цифровую подпись, чтобы доказать, что только сервер мог создать ее.
Вот как это работает: ваш сервер вычисляет хеш данных и шифрует хеш, используя какой-то закрытый ключ на сервере (ключ подписи). Затем сервер отправляет сообщение (в виде простого текста) и хэш клиенту. Когда клиент получает две части данных, он дешифрует зашифрованный хэш с помощью открытого ключа сервера (проверочный ключ). Теперь клиент может самостоятельно вычислить хэш простого текстового сообщения и сравнить его с хешем, отправленным сервером. Если два хэша совпадают, то клиент знает, что сообщение, должно быть, пришло с сервера и больше ни от кого.
Примечание. Вы отправляете сообщение в виде простого текста, поэтому в этой системе нет конфиденциальности. Этот механизм подписания гарантирует только целостность и подлинность. Если вам также нужна конфиденциальность, вы можете использовать традиционное шифрование для шифрования сообщения вместо его отправки в виде простого текста.
TLS делает такие вещи, поэтому вы можете рассмотреть возможность использования его в качестве канала данных.
Ваше требование - в значительной степени описание учебника односторонней аутентификации в режиме TLS (прежний SSL), также называемой аутентификацией на стороне сервера. По сути, это то, что происходит каждый раз, когда вы находитесь на веб-сайте https.
Но, предполагая, что вы знаете о https, я предполагаю, что вы пытаетесь передать не данные http, а какой-то другой протокол. Вот где сияет TLS: он реализован на транспортном уровне и, следовательно, не зависит от любого протокола данных приложения, вы можете отправлять произвольные данные через зашифрованный / проверенный TLS сокет.
TLS проверен в бою и в значительной степени хорош с безопасными транспортными протоколами. Все, что вы катите самостоятельно, с большой вероятностью будет менее безопасным - разработка защищенных протоколов - одна из самых сложных вещей, которую нужно получить.