DTLS, вероятно, является лучшим решением, однако, похоже, что очень плохо документировано. Некоторое время назад я искал подобное решение, и все ссылки, которые я видел на реализацию DTLS в OpenSSL, указывают на то, что вам нужно будет изучить примеры и исходный код OpenSSL, чтобы понять, как его использовать. ... что для меня означает, что я сделаю 10 серьезных ошибок безопасности, когда попытаюсь это настроить. Кроме того, я не верю, что библиотека pyOpenSSL экспортирует эту функциональность.
Альтернативой, которую я рассматривал, является протокол безопасного удаленного пароля . Преимущество этого решения заключается в том, что оно обеспечивает надежную взаимную аутентификацию (наравне с безопасностью Kerberos в соответствии с документами) и, что не менее важно в вашем случае, обеспечивает оба конца общим сеансовым ключом, который можно использовать для шифрования. ,
Учитывая общий ключ, каждый пакет может содержать AES256_CBC( <random starter block for CBC><user-id><sequence_number><application data> )
Если при расшифровке удается получить ожидаемый идентификатор пользователя, пакет аутентифицируется как исходящий от вашего пользователя, и порядковый номер может использоваться для избежания атак воспроизведения.
Одним из недостатков SRP является то, что в Python сжатие чисел происходит довольно медленно. Я изменил демонстрационный код Python на что-то более удобное для использования и обнаружил, что для выполнения одного обмена SRP клиент-сервер (процессор 2 ГГц) потребовалось около 300 мс. Однако прямая реализация в C ++ алгоритма SRP с использованием поддержки BigNumber в OpenSSL заняла всего 2 мс. Так что, если вы собираетесь пойти по этому пути, я настоятельно рекомендую использовать реализацию C / C ++ алгоритма для производственного кода. В противном случае вы, вероятно, сможете обрабатывать только несколько входов в секунду.