Table of Contents

Защищенная передача данных. Просмотр трафика. JSON.

Защищенная передача данных

Дано

Задача

Элис требуется отправить сообщение message Бобу, чтобы никто кроме Боба не мог его прочитать.

Алгоритм

  1. Элис запрашивает у Боба его PublicKey_Bob
  2. Элис шифрует свое сообщение message_encrypted = Encrypt(message, PublicKey_Bob)
  3. Элис отправляет message_encrypted Бобу по незащищенному каналу
  4. Боб расшифровывает message_decrypted = Decrypt(message_encrypted, PrivateKey_Bob)

На выходе имеем: message == message_decrypted

То есть message == Decrypt(Encrypt(message, PublicKey_Bob), PrivateKey_Bob)

Правила безопасности

Практика шифрования файла при помощи 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

Смотрим HTTP трафик

Исходный код сервера см. в 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

Д/З

  1. Создать про помощи gpg связку ключей. Экспортировать свой публичный ключ в текстовый файл.
  2. Отправить Олегу Андреевичу файл, содержащий Ваш публичный ключ.
  3. Получить в ответ зашифрованное сообщение, расшифровать его при помощи gpg.
  4. Отправить Олегу Андреевичу расшифрованное сообщение.

Заметки лектора