Aula 10 – Criptografia na Prática com Python 🐍
Teoria é essencial, mas é escrevendo código que a criptografia se torna uma ferramenta real. Nesta aula vamos usar a biblioteca cryptography, o padrão de mercado em Python.
📦 Instalando a Biblioteca
Nunca implemente sua própria criptografia
Regra de ouro da segurança: nunca escreva seu próprio algoritmo de criptografia para uso em produção. Use sempre bibliotecas revisadas e testadas por especialistas — pequenos erros de implementação podem quebrar toda a segurança.
🔑 Hash com hashlib (biblioteca padrão)
import hashlib
texto = "senha123"
hash_sha256 = hashlib.sha256(texto.encode()).hexdigest()
print(hash_sha256)
# ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94
🔐 Criptografia Simétrica com Fernet
O Fernet (parte da biblioteca cryptography) implementa AES de forma segura e simples, cuidando automaticamente do modo de operação e da autenticação.
from cryptography.fernet import Fernet
# Gerando uma chave (guarde-a com segurança!)
chave = Fernet.generate_key()
f = Fernet(chave)
# Cifrando
texto_cifrado = f.encrypt(b"Mensagem secreta")
print(texto_cifrado)
# Decifrando
texto_original = f.decrypt(texto_cifrado)
print(texto_original.decode()) # "Mensagem secreta"
graph LR
A["b'Mensagem secreta'"] -- "Fernet.encrypt(chave)" --> B["Token cifrado (base64)"]
B -- "Fernet.decrypt(chave)" --> C["b'Mensagem secreta'"] 🔓 Criptografia Assimétrica com RSA em Python
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
# Gerando o par de chaves
chave_privada = rsa.generate_private_key(public_exponent=65537, key_size=2048)
chave_publica = chave_privada.public_key()
# Cifrando com a chave publica
mensagem = b"Dados confidenciais"
cifrado = chave_publica.encrypt(
mensagem,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
# Decifrando com a chave privada
decifrado = chave_privada.decrypt(
cifrado,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
print(decifrado.decode()) # "Dados confidenciais"
💻 Exemplo em Terminal (Python CLI)
$ python -c "import hashlib; print(hashlib.sha256(b'ola mundo').hexdigest())" $ 4c37a...b91e2 $ $ python -c "from cryptography.fernet import Fernet; k=Fernet.generate_key(); print(k)" $ b'dGhpcyBpcyBhIHRlc3Qga2V5IGZvciBkZW1v...'
📝 Exercícios de Fixação
- Básico: Instale a biblioteca
cryptographye calcule o hash SHA-256 de uma frase à sua escolha. - Básico: Gere uma chave Fernet e cifre uma mensagem curta.
- Intermediário: Por que o
Fernet.encrypt()produz um resultado diferente cada vez que você cifra a mesma mensagem, mesmo usando a mesma chave? (Dica: pense no IV da Aula 04). - Intermediário: Modifique o exemplo de RSA para cifrar e decifrar uma mensagem digitada pelo usuário via
input(). - Desafio: Escreva uma função
cifrar_arquivo(caminho, chave)que lê um arquivo, cifra seu conteúdo com Fernet e salva o resultado em um novo arquivo.
🚀 Mini-Projeto: Cofre de Senhas em Python
Objetivo: Criar um mini "gerenciador de senhas" de linha de comando.
- Gere e salve uma chave Fernet em um arquivo separado (
chave.key). - Crie funções
salvar_senha(servico, senha)que cifra a senha e salva num arquivocofre.txt(formatoservico:token_cifrado). - Crie uma função
ler_senha(servico)que busca a linha correspondente e decifra a senha. - Teste salvando e recuperando senhas para 2 ou 3 serviços fictícios.