Skip to main content

Usando bibliotecas Python para comunicação de rede segura

Escrito por
feature assert in python

30 de janeiro de 2023

0 minutos de leitura

Python é uma linguagem de programação popular e poderosa, frequentemente usada para criar aplicações web, analisar dados e automatizar tarefas. Um dos principais desafios nesses projetos é garantir a segurança da comunicação de rede, que pode estar vulnerável a diversas ameaças, como ataques man-in-the-middle e espionagem. Felizmente, o Python oferece várias bibliotecas para criptografar e proteger a comunicação de rede. Neste artigo, vamos explorar duas das mais populares: cryptography e Paramiko.

Ao escolher uma biblioteca Python para comunicação de rede segura, é importante considerar os requisitos específicos da sua aplicação e o nível de segurança necessário. A cryptography é uma boa opção para aplicações que precisam de uma ampla variedade de algoritmos e protocolos criptográficos, enquanto o Paramiko é mais indicado para comunicação baseada em SSH. Também é possível usar as duas bibliotecas em conjunto — por exemplo, para criptografar dados com cryptography e depois transmiti-los com segurança por SSH usando o Paramiko.

Cryptography

A cryptography é uma biblioteca Python amplamente usada que oferece uma variedade de algoritmos e protocolos criptográficos. Ela oferece suporte a várias operações criptográficas, incluindo criptografia simétrica e assimétrica, troca de chaves e assinaturas digitais. Com a cryptography, é possível transmitir dados com segurança por uma rede não segura, como a internet, e verificar a autenticidade e a integridade dos dados no destino.

Veja um exemplo de como usar a biblioteca cryptography em Python para criptografar e descriptografar dados e garantir uma comunicação de rede segura:

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

# Generate a random password for the key
password = b'123456'

# Generate a salt
salt = os.urandom(16)

# Derive a key from the password using PBKDF2
kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=100000
)
key = base64.urlsafe_b64encode(kdf.derive(password))

# Create a Fernet cipher using the key
cipher = Fernet(key)

# Encrypt a message
encrypted_message = cipher.encrypt(b'Hello, world!')

# Decrypt the message
decrypted_message = cipher.decrypt(encrypted_message)

Este exemplo mostra as etapas básicas para usar a cryptography na criptografia e descriptografia de dados. Primeiro, geramos uma senha aleatória e um salt, que serão usados para derivar uma chave para a cifra. Usamos o algoritmo PBKDF2HMAC para derivar a chave a partir da senha, usando o salt e uma função hash robusta.

Depois de obter a chave, criamos uma cifra Fernet usando a classe Fernet. Essa é uma cifra simétrica, ou seja, usa a mesma chave para criptografar e descriptografar. Em seguida, usamos o método encrypt() para criptografar uma mensagem e o método decrypt() para descriptografar a mensagem criptografada. O resultado é uma comunicação segura e criptografada, que pode ser transmitida por uma rede não segura.

Este é apenas um exemplo simples de como usar a cryptography para uma comunicação segura. A biblioteca oferece muitos outros recursos e funcionalidades, como suporte a diferentes modos de cifra e protocolos de troca de chaves. Para saber mais e ver outros exemplos, consulte a documentação da cryptography.

Paramiko 

Paramiko é outra biblioteca Python popular para comunicação de rede segura. Ela se baseia no protocolo SSH (Secure Shell), comumente usado para se conectar a servidores remotos e transferir arquivos com segurança. O Paramiko oferece uma interface Pythonic para o protocolo SSH, permitindo que desenvolvedores implementem facilmente uma comunicação segura em suas aplicações. A biblioteca também oferece suporte a diversos recursos avançados, como autenticação por chave pública e encaminhamento de agente.

O uso básico do Paramiko é muito simples:

import paramiko

# Create an SSH client
client = paramiko.SSHClient()

# Load the host keys
client.load_system_host_keys()

# Connect to the server
client.connect('hostname', username='user', password='password')

# Run a command
stdin, stdout, stderr = client.exec_command('ls -l')

# Print the output
print(stdout.read().decode())

# Close the connection
client.close()

Este exemplo mostra as etapas básicas para usar o Paramiko e se conectar a um servidor remoto por SSH para executar um comando. Primeiro, criamos um objeto SSHClient, que representa a conexão SSH. Depois, carregamos as chaves de host do servidor para que o Paramiko possa verificar a identidade dele. Em seguida, nos conectamos ao servidor usando o método connect() e informamos o nome do host, o nome de usuário e a senha.

Depois de nos conectar, podemos executar um comando no servidor usando o método exec_command(). Esse método retorna os fluxos de entrada padrão, saída padrão e erro do comando, que podemos ler e processar conforme necessário. Neste exemplo, executamos o comando ls -l, que lista os arquivos do diretório atual, e exibimos a saída no console. Por fim, encerramos a conexão com o método close().

Em termos de integração, tanto a cryptography quanto o Paramiko têm documentação abrangente e são fáceis de usar. As duas bibliotecas oferecem APIs claras e concisas, além de exemplos detalhados e tutoriais disponíveis online. No entanto, como acontece com qualquer biblioteca criptográfica, é importante seguir as práticas recomendadas para garantir a segurança da sua implementação. Isso inclui usar chaves fortes e exclusivas, gerenciar e armazenar as chaves corretamente e atualizar as bibliotecas regularmente para corrigir vulnerabilidades conhecidas.

Assim como acontece com todos os pacotes que você importa no seu software, analisar vulnerabilidades em dependências com o Snyk ajuda a identificar vulnerabilidades conhecidas e garante que as versões escolhidas sejam seguras para uso.

Como proteger a comunicação de rede

Em resumo, cryptography e Paramiko são ferramentas poderosas e eficazes para proteger a comunicação de rede em Python. Com essas bibliotecas, desenvolvedores podem criar aplicações que transmitem dados com segurança e protegem contra ameaças comuns, como espionagem e ataques man-in-the-middle. Elas também são flexíveis e fáceis de integrar, o que as torna uma ótima opção para diversos projetos em Python.

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.