Fundamentos de Criptografia - Tecnologias para Proteger Dados

14 min leitura | 2025.12.06

O Que e Criptografia

Criptografia e a tecnologia de transformar dados em um formato ilegivel para terceiros. Somente aqueles que possuem a chave correta podem restaurar (descriptografar) os dados originais.

Por que e necessaria: Para lidar com riscos de dados caindo em maos erradas, como interceptacao de comunicacoes, acesso nao autorizado a bancos de dados e perda de dispositivos.

Tipos de Criptografia

flowchart LR
    subgraph Crypto["Tecnologias de Criptografia"]
        subgraph Symmetric["Criptografia de Chave Simetrica"]
            S1["Mesma chave para criptografar/descriptografar"]
        end

        subgraph Asymmetric["Criptografia de Chave Publica (Assimetrica)"]
            A1["Chaves diferentes para criptografar/descriptografar"]
        end

        subgraph Hash["Funcoes Hash (Funcoes Unidirecionais)"]
            H1["Impossivel reverter, apenas verificacao"]
        end
    end

Criptografia de Chave Simetrica

Usa a mesma chave para criptografia e descriptografia.

flowchart LR
    P1["Texto Plano"] --> E["Criptografar"]
    K1["Chave Simetrica"] --> E
    E --> C["Texto Cifrado"]
    C --> D["Descriptografar"]
    K2["Chave Simetrica (mesma)"] --> D
    D --> P2["Texto Plano"]

Algoritmos Representativos

AlgoritmoTamanho da ChaveCaracteristicas
AES128/192/256 bitsPadrao atual, rapido
ChaCha20256 bitsPara dispositivos moveis, rapido
3DES168 bitsLegado, nao recomendado

Exemplo de Implementacao

const crypto = require('crypto');

// Criptografar
function encrypt(text, key) {
  const iv = crypto.randomBytes(16);
  const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  const authTag = cipher.getAuthTag();
  return {
    iv: iv.toString('hex'),
    encrypted,
    authTag: authTag.toString('hex')
  };
}

// Descriptografar
function decrypt(encryptedData, key) {
  const decipher = crypto.createDecipheriv(
    'aes-256-gcm',
    key,
    Buffer.from(encryptedData.iv, 'hex')
  );
  decipher.setAuthTag(Buffer.from(encryptedData.authTag, 'hex'));
  let decrypted = decipher.update(encryptedData.encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

Vantagens e Desvantagens

VantagensDesvantagens
RapidoDistribuicao de chaves e um desafio
Adequado para criptografar grandes volumes de dadosNecessita de uma chave para cada parceiro de comunicacao

Criptografia de Chave Publica (Assimetrica)

Usa chaves diferentes (chave publica e chave privada) para criptografia e descriptografia.

sequenceDiagram
    participant S as Remetente
    participant R as Destinatario

    Note over R: Chave Privada (somente o destinatario possui)<br/>Chave Publica (publica)

    R->>S: Envia chave publica
    S->>S: Criptografa texto plano com chave publica
    S->>R: Envia texto cifrado
    R->>R: Descriptografa com chave privada → Texto plano

Algoritmos Representativos

AlgoritmoUsoCaracteristicas
RSACriptografia, assinaturaAmplamente utilizado
ECDSAAssinaturaAlta seguranca com chaves curtas
Ed25519AssinaturaRapido, moderno
X25519Troca de chavesCurva eliptica Diffie-Hellman

Assinatura Digital

Assina com a chave privada e verifica com a chave publica.

sequenceDiagram
    participant S as Remetente (Assinatura)
    participant R as Destinatario (Verificacao)

    S->>S: Assina dados com chave privada
    S->>R: Envia dados + assinatura
    R->>R: Verifica com chave publica → Autentico/Falso

Vantagens e Desvantagens

VantagensDesvantagens
Distribuicao segura de chavesMais lento que criptografia simetrica
Pode ser usado para autenticacao e assinaturasNao adequado para grandes volumes de dados

Criptografia Hibrida

Em sistemas reais, ambos os metodos sao usados em combinacao.

sequenceDiagram
    participant S as Remetente
    participant R as Destinatario

    S->>S: 1. Gera chave simetrica aleatoria
    S->>S: 2. Criptografa dados com chave simetrica (rapido)
    S->>S: 3. Criptografa chave simetrica com chave publica do destinatario
    S->>R: 4. Envia dados criptografados + chave simetrica criptografada
    R->>R: 5. Descriptografa chave simetrica com chave privada
    R->>R: 6. Descriptografa dados com chave simetrica

Funcoes Hash

Geram um valor hash de comprimento fixo a partir de dados de qualquer tamanho. Os dados originais nao podem ser recuperados.

flowchart LR
    A["'Hello'"] --> H1["SHA-256"] --> R1["185f8db32271fe25..."]
    B["'Hello!'"] --> H2["SHA-256"] --> R2["334d016f755cd6dc..."]

    Note["Apenas uma mudanca de caractere<br/>resulta em hash completamente diferente"]

Algoritmos Representativos

AlgoritmoTamanho da SaidaUso
SHA-256256 bitsHash de proposito geral
SHA-3VariavelPadrao de proxima geracao
bcryptVariavelHash de senha
Argon2VariavelHash de senha (recomendado)

Hashing de Senhas

const bcrypt = require('bcrypt');

// Hash de senha
async function hashPassword(password) {
  const saltRounds = 12;
  return await bcrypt.hash(password, saltRounds);
}

// Verificacao de senha
async function verifyPassword(password, hash) {
  return await bcrypt.compare(password, hash);
}

// Exemplo de uso
const hash = await hashPassword('mypassword123');
// → "$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8..."

const isValid = await verifyPassword('mypassword123', hash);
// → true

Sempre armazene senhas com hash: Armazenar em texto plano e absolutamente proibido. Use funcoes hash com salt (bcrypt, Argon2).

Escolha por Caso de Uso

Caso de UsoMetodo Recomendado
Criptografia de comunicacao (HTTPS)TLS (criptografia hibrida)
Criptografia de arquivosAES-256-GCM
Armazenamento de senhasArgon2, bcrypt
Deteccao de adulteracao de dadosHMAC-SHA256
Assinatura digitalEd25519, ECDSA
Geracao de chaves APICSPRNG + Base64

Resumo

Criptografia e a tecnologia fundamental para seguranca de dados. Criptografia de chave simetrica e rapida e adequada para criptografar grandes volumes de dados, enquanto criptografia de chave publica e adequada para distribuicao de chaves e autenticacao. Em sistemas reais, criptografia hibrida combinando ambas e utilizada. Sempre use funcoes hash com salt para armazenamento de senhas.

← Voltar para a lista