Pular para conteúdo

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

pip install cryptography

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

  1. Básico: Instale a biblioteca cryptography e calcule o hash SHA-256 de uma frase à sua escolha.
  2. Básico: Gere uma chave Fernet e cifre uma mensagem curta.
  3. 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).
  4. Intermediário: Modifique o exemplo de RSA para cifrar e decifrar uma mensagem digitada pelo usuário via input().
  5. 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.

  1. Gere e salve uma chave Fernet em um arquivo separado (chave.key).
  2. Crie funções salvar_senha(servico, senha) que cifra a senha e salva num arquivo cofre.txt (formato servico:token_cifrado).
  3. Crie uma função ler_senha(servico) que busca a linha correspondente e decifra a senha.
  4. Teste salvando e recuperando senhas para 2 ou 3 serviços fictícios.

Ir para Aula 11