====== Защищенная передача данных. Просмотр трафика. 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. Это добавит реальной атмосферы незащищенного канала связи (общий чат), но информация читается только получателем.