Вся логика чата с шифровкой RSA
Только недавно начал изучать RSA шифровку. Хочу поинтересоваться, а как получать ключи шифрования после того, как был осуществлён выход из приложения? Как передавать публичный ключ на сервер? И как после ввода пароля пользователя, ему возвращались его ключи? Если вопросы странные или бессмысленные, прошу помочь мне. Я хочу сделать простой чат, где все сообщения будут шифроваться. Примерную логику я понял, но я не осознаю, как хранить ключи у пользователя, а уж тем более, выдавать их ему после ввода пароля. Объясните это пожалуйста, буду благодарен
Ответы (1 шт):
Берём
- ASP.NET Core
- SirnalR (работает на базе WebSocket)
- Базу данных, например MySQL или PostgreSQL
- Покупаем домен второго уровня (~1000 деревянных рублей в год)
- Генерим халявный Let's Encrypt сертификат для HTTPS
- Покупаем сервер на хостинге, где всё это будет жить
Пишем клиенты
- Для браузера
- Для десктопа
- Для мобилы
(соль, перец по вкусу)
Пишем логику чата на готовых механизмах и не тратим время на изобретение велосипедов.
Итого, вам для полноценного продукта придется написать кучу логики, но ни минуты не придется тратить на вопросы шифрования и прочие низкоуровневые штуки, сервер всё сделает за вас.
Бесплатные Let's Encrypt сертификаты действуют недолго, всего 90 дней, но перегенерацию можно автоматизировать по расписанию и вообще не вспомниать про это неудобство. Смысл этих сертификатов в том, что им доверяет браузер, следовательно чат будет работать в браузере через HTTPS у кого угодно. Если браузер не нужен, можно и самому подписать сертификат для сервера, клиенту при этом никакие ключи передавать не надо, оно само произойдёт по протоколу TLS.
На этой системе шифрования весь интернет живёт, логично предположить, что она надёжная. Если интересно, как оно устроено, почитайте про TLS 1.2 или 1.3 шифрование, статей много, документация детальнее некуда.
В трёх словах, как устроено TLS шифрование:
- У сервера есть 2 ключа, публичный и приватный.
- Публичный ключ при подключении клиента передаётся сервером.
- Публичный ключ используется для шифрования сообщения, приватный для расшифровки, приватный ключ знает только сервер.
- Клиент получает публичный ключ, генерирует рандомный ключ уже симметричного шифрования (например AES), шифрует его публичным ключом сервера и отправляет. Расшифровать это сообщение никто кроме сервера не сможет.
- Сервер получает ключ и теперь он может шифровать этим ключом сообщения, которые может расшифровать только клиент. Клиент переходит на использование сгенерированного ключа и так же шифрует весь дальнейший трафик с помощью симметричного ключа.
- Дальнейший обмен данными происходит с использованием AES шифрования. RSA в свою очередь служит только для безопасного обмена ключами и для шифрования рабочего канала связи оно не используется.
Подробнее можно почитать в документации TLS.