Pular para conteúdo

Projeto 16: Projeto Capstone: Sistema Completo de Autenticação e Cofre Criptográfico 🎓

Escopo do Projeto

Objetivo: Conceber e desenvolver o sistema unificado de segurança da informação do curso: uma plataforma de autenticação com senhas Argon2id, segundo fator MFA TOTP obrigatório, tokens JWT assinados assimetricamente e cofre de segredos cifrado com AES-256-GCM.


🎯 1. Contexto & Desafio Prático

Este projeto integrador consolida os 15 tópicos estudados na especialização. Você construirá o núcleo de autenticação e proteção de dados de uma aplicação corporativa: desde o onboarding com geração de segredos TOTP, até o armazenamento com hash de alta memória, geração de sessões sem estado com verificação de assinatura digital e armazenamento cifrado de anotações confidenciais do usuário.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Ciclo de Cadastro e Senha Segura): Cadastrar credenciais de usuários gerando hashes Argon2id com parâmetros oficiais da OWASP e rejeitando senhas fracas.
  • R2 (Segundo Fator de Autenticação - MFA TOTP): Exigir geração e validação de código numérico de 6 dígitos baseado em HMAC (RFC 6238) antes de conceder a sessão.
  • R3 (Tokens de Acesso JWT com Assinatura Digital): Emitir Access Tokens assinados com algoritmo assimétrico (RS256 ou Ed25519) contendo tempo de expiração curto (15 min) e emissor validado.
  • R4 (Cofre Pessoal Cifrado com AES-256-GCM): Implementar módulo de armazenamento onde cada anotação secreta do usuário é protegida com chave de 256 bits derivada do segredo do usuário, com verificação de integridade.

📐 3. Diagrama Conceitual & Arquitetura

sequenceDiagram
    autonumber
    participant User as Usuário / Cliente
    participant Auth as Auth Server (Argon2id + TOTP)
    participant Vault as Cofre Criptográfico (AES-GCM)
    participant DB as Banco Seguro
    User->>Auth: 1. Login (E-mail + Senha)
    Auth->>DB: Busca Hash Argon2id
    Auth->>Auth: Valida Senha em Tempo Constante
    Auth-->>User: Solicita Desafio MFA TOTP (6 Dígitos)
    User->>Auth: 2. Submete Código TOTP do App Authenticator
    Auth->>Auth: Valida Janela de Tempo TOTP
    Auth-->>User: Retorna JWT Assinado Assimetricamente (RS256)
    User->>Vault: 3. Salvar Segredo (Bearer JWT + Payload)
    Vault->>Vault: Valida Assinatura do JWT
    Vault->>DB: Persiste Dado Cifrado com AES-256-GCM
    Vault-->>User: Confirmação de Gravação Segura!

💻 4. Especificação Técnica & Código de Referência

// secure_capstone_core.py
import os
import time
import secrets
import hmac
import hashlib
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

class SecureCapstoneSystem:
    def __init__(self):
        self.users_db = {}
        self.vault_db = {}

    def register_user(self, username: str, password: str) -> str:
        salt = secrets.token_bytes(16)
        pwd_hash = hashlib.sha256(salt + password.encode('utf-8')).hexdigest()
        totp_secret = secrets.token_hex(16)

        self.users_db[username] = {
            "salt": salt.hex(),
            "hash": pwd_hash,
            "totp_secret": totp_secret
        }
        return totp_secret

    def verify_login(self, username: str, password: str, totp_token: str) -> bool:
        user = self.users_db.get(username)
        if not user:
            return False

        # 1. Validar senha
        salt = bytes.fromhex(user["salt"])
        computed_hash = hashlib.sha256(salt + password.encode('utf-8')).hexdigest()
        if not hmac.compare_digest(computed_hash, user["hash"]):
            return False

        # 2. Validar token MFA (TOTP simplificado de 6 dígitos)
        secret = user["totp_secret"].encode('utf-8')
        timestep = int(time.time() // 30)
        expected_token = f"{int(hashlib.sha256(secret + str(timestep).encode()).hexdigest(), 16) % 1_000_000:06d}"

        return hmac.compare_digest(totp_token, expected_token)

    def store_vault_secret(self, username: str, user_encryption_key: bytes, note_plaintext: bytes):
        aesgcm = AESGCM(user_encryption_key)
        iv = os.urandom(12)
        ciphertext = aesgcm.encrypt(iv, note_plaintext, None)
        self.vault_db[username] = {"iv": iv.hex(), "ciphertext": ciphertext.hex()}
        return True

if __name__ == '__main__':
    capstone = SecureCapstoneSystem()
    totp = capstone.register_user("aluno_seguranca", "MasterKey@2026_Secure")
    print("Usuário registrado com credencial e segredo MFA gerados.")

📦 5. Critérios de Avaliação e Entrega

  1. Arquitetura ponta a ponta com autenticação em múltiplos fatores (Argon2id + TOTP).
  2. Sessões baseadas em tokens assinados digitalmente com curto tempo de vida.
  3. Armazenamento autenticado de dados confidenciais via AES-256-GCM.