====== Защищенная передача данных. Просмотр трафика. JSON. ====== ===== Защищенная передача данных ===== ==== Дано ==== * Alice — отправитель сообщения ''message'' * Bob — получатель (''PrivateKey_Bob'', ''PublicKey_Bob'') ==== Задача ==== Элис требуется отправить сообщение ''message'' Бобу, чтобы никто кроме Боба не мог его прочитать. ==== Алгоритм ==== - Элис запрашивает у Боба его ''PublicKey_Bob'' - Элис шифрует свое сообщение ''message_encrypted = Encrypt(message, PublicKey_Bob)'' - Элис отправляет ''message_encrypted'' Бобу по незащищенному каналу - Боб расшифровывает ''message_decrypted = Decrypt(message_encrypted, PrivateKey_Bob)'' На выходе имеем: ''message == message_decrypted'' То есть ''message == Decrypt(Encrypt(message, PublicKey_Bob), PrivateKey_Bob)'' ==== Правила безопасности ==== * Открытый ключ можно и нужно опубликовать в открытом доступе для всех желающих. Например см. https://keys.openpgp.org * Приватный ключ храним в секрете!!! ===== Практика шифрования файла при помощи GNU Privacy Guard (GPG) ===== https://gnupg.org # Боб создает связку GPG ключей: name = Bob, email = bob@example.com (Bob) $ gpg --full-gen-key > (1) RSA and RSA > 4096 > Bob Ivanov > bob@example.com > 8312 (ваша группа в ННГУ) > придумать, запомнить и ввести Passphrase # Боб экспортирует открытый ключ, чтобы передать его Элис (Bob) $ gpg --export -a bob@example.com > PublicKey_Bob.gpg # Боб отправляет файл PublicKey_Bob.gpg Элис доступным способом (почта, telegram, флешка и тп) # Элис импортирует ключ Боба в GPG (Alice) $ gpg --import PublicKey_Bob.gpg # Элис делает ключ Боба доверенным (Alice) $ gpg --edit-key bob@example.com > trust > 5 > quit # Элис шифрует файл с сообщением при помощи открытого ключа Боба # результат сохраняется в message.txt.asc (aka message_encrypted) (Alice) $ gpg -e -a -r bob@example.com message.txt # Элис отправляет зашифрованный файл message.txt.asc Бобу # Боб расшифровывает message.txt.asc (aka message_encrypted) (Bob) $ gpg -d -o message_decrypted.txt message.txt.asc ==== Полезные команды ==== # список открытых ключей $ gpg -k # список секретных ключей $ gpg -K ===== Просмотр сетевого трафика ===== ==== Замечания про HTTP ==== * Сетевая модель OSI: стек протоколов, инкапсуляция ("матрешка") * Первоисточник: стандарты RFC, публикуются организацией https://www.ietf.org. Сайт https://www.rfc-editor.org. Примеры: * [[https://www.rfc-editor.org/info/rfc793|RFC 793 Transmission Control Protocol, September 1981]] * [[https://www.rfc-editor.org/info/rfc791|RFC 791 Internet Protocol, September 1981]] ==== Смотрим HTTP трафик ==== Исходный код сервера [[https://github.com/olegsklyarov/unn-http-api-bots|см. в git]]. # установка wireshark $ sudo apt install wireshark $ sudo dpkg-reconfigure wireshark-common $ sudo chmod +x /usr/bin/dumpcap # запускаем wireshark $ wireshark # запускаем HTTP сервер $ python3 http-server.py # отправляем HTTP запрос $ curl "http://127.0.0.1:8000?login=user&password=passwd" https://www.cloudflare.com/learning/ssl/why-is-http-not-secure/ ==== Смотрим HTTPS трафик ==== # Генерируем самоподписанный ключ и сертификат $ openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out cert.pem # запускаем HTTPS сервер $ python3 https-server.py # отправляем HTTPS запрос (ошибка curl: самоподписанный сертификат) $ curl https://127.0.0.1:8443 # отправляем HTTPS запрос (разрешаем самоподписанный сертификат) $ curl --insecure "https://127.0.0.1:8443?login=user&password=passwd" На будущее: в каждом запросе в Telegram Bot API используется секретный **token**. Это можно делать только в HTTPS! ===== JSON ===== JavaScript Object Notation * human-readable * https://docs.python.org/3/library/json.html * https://jsonpath.com * https://jqlang.org ===== Д/З ===== - Создать про помощи ''gpg'' связку ключей. Экспортировать свой публичный ключ в текстовый файл. - Отправить [[https://t.me/olegsklyarov|Олегу Андреевичу]] файл, содержащий Ваш публичный ключ. - Получить в ответ зашифрованное сообщение, расшифровать его при помощи ''gpg''. - Отправить [[https://t.me/olegsklyarov|Олегу Андреевичу]] расшифрованное сообщение. ==== Заметки лектора ==== * Данный контент занял примерно час, остальное время принимали GPG зачет. Можно добавлять ещё материал. * Идея: написать [[chat-bots/projects/gpg-checker-bot#бот для приема GPG зачета]] * Открытые ключ можно смело слать в общий чат, отмечать выполненные реакцией emoji. Это добавит реальной атмосферы незащищенного канала связи (общий чат), но информация читается только получателем.