Pular para conteúdo

ENCRYPT - Criptografia de Dados

O que é este Node?

O ENCRYPT é o node responsável por criptografar dados sensíveis no Lumina Flow Builder. Ele utiliza algoritmos de criptografia simétrica para proteger informações confidenciais.

Por que este Node existe?

Proteção de dados é essencial em qualquer sistema moderno. O ENCRYPT existe para:

  1. Segurança de Dados: Proteger informações sensíveis como senhas, dados pessoais, e informações financeiras
  2. Conformidade Legal: Atender requisitos de LGPD, GDPR e outras regulamentações de proteção de dados
  3. Criptografia Simétrica: Usar algoritmos robustos como AES-256 para garantir segurança
  4. Flexibilidade: Suportar diferentes algoritmos e encodings conforme necessidade
  5. Integridade: Garantir que dados possam ser descriptografados apenas com a chave correta

Como funciona internamente?

Quando o ENCRYPT é executado, o sistema:

  1. Recebe os dados: Captura o texto ou dados a serem criptografados
  2. Gera ou usa chave: Utiliza chave fornecida ou gera uma nova chave de 32 bytes
  3. Gera IV: Cria um vetor de inicialização (IV) aleatório de 16 bytes
  4. Criptografa: Usa o algoritmo especificado (padrão AES-256-CBC) para criptografar
  5. Codifica: Converte resultado para encoding especificado (padrão hexadecimal)
  6. Retorna dados criptografados: Fornece dados criptografados, chave e IV para uso posterior

Código interno (security-executor.service.ts:82-113):

private async executeEncrypt(parameters: any, context: any): Promise<any> {
  const { data, algorithm, key, encoding } = parameters;

  this.logger.log(`🔒 ENCRYPT - Algorithm: ${algorithm || 'aes-256-cbc'}`);

  if (!data) {
    throw new Error('Data is required for encryption');
  }

  try {
    const encryptionKey = key || this.generateKey();
    const iv = crypto.randomBytes(16);
    const algorithm_name = algorithm || 'aes-256-cbc';
    const cipher = crypto.createCipheriv(algorithm_name, Buffer.from(encryptionKey.slice(0, 32)), iv);

    let encrypted = cipher.update(data, 'utf8', encoding || 'hex');
    encrypted += cipher.final(encoding || 'hex');

    return {
      success: true,
      action: 'data_encrypted',
      algorithm: algorithm || 'aes-256-cbc',
      encoding: encoding || 'hex',
      encryptedData: encrypted,
      key: encryptionKey,
      iv: iv.toString('hex'),
      timestamp: new Date().toISOString()
    };
  } catch (error) {
    throw new Error(`Encryption failed: ${error.message}`);
  }
}

Quando você DEVE usar este Node?

Use ENCRYPT sempre que precisar de proteção de dados sensíveis:

Casos de uso

  1. Armazenamento Seguro: "Preciso criptografar senhas antes de salvar no banco de dados"
  2. Transmissão Segura: "Preciso criptografar dados antes de enviar via API"
  3. Dados Pessoais: "Preciso proteger CPF, RG e dados bancários dos usuários"
  4. Informações Financeiras: "Preciso criptografar números de cartão de crédito"
  5. Segredos e Tokens: "Preciso proteger API keys e tokens de terceiros"

Quando NÃO usar ENCRYPT

  • Hash de Senhas: Use bibliotecas de hash (bcrypt) ao invés de ENCRYPT para senhas
  • Assinatura Digital: Use TOKEN ao invés de ENCRYPT
  • Autenticação: Use AUTH ao invés de ENCRYPT

Parâmetros Detalhados

data (string, obrigatório)

O que é: Dados que serão criptografados. Pode ser texto, JSON, números, etc.

Flow completo para testar:

{
  "name": "Teste ENCRYPT - Data",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Digite Dados",
        "parameters": {
          "message": "Digite os dados sensíveis para criptografar:",
          "variableName": "dados"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Criptografar",
        "parameters": {
          "data": "{{dados}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Dados criptografados: {{encrypt_1.encryptedData}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite qualquer texto. O sistema deve retornar dados criptografados em hexadecimal.

algorithm (string, opcional)

O que é: Algoritmo de criptografia a ser utilizado.

Padrão: "aes-256-cbc"

Valores suportados: aes-256-cbc, aes-192-cbc, aes-128-cbc, aes-256-gcm

Flow completo para testar:

{
  "name": "Teste ENCRYPT - Algorithm",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Criptografar AES-256",
        "parameters": {
          "data": "Dados secretos",
          "algorithm": "aes-256-cbc"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "message": "Algoritmo usado: {{encrypt_1.algorithm}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Executa criptografia com AES-256-CBC. Deve confirmar o algoritmo usado.

key (string, opcional)

O que é: Chave de criptografia customizada. Se não fornecida, uma chave aleatória será gerada.

Padrão: Chave aleatória de 32 bytes (64 caracteres hexadecimais)

Flow completo para testar:

{
  "name": "Teste ENCRYPT - Custom Key",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Definir Chave",
        "parameters": {
          "name": "minhaChave",
          "value": "minhachavesecreta12345678901234567890123456789012"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Criptografar",
        "parameters": {
          "data": "Dados importantes",
          "key": "{{minhaChave}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Criptografado com chave customizada!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Usa chave customizada para criptografia. Deve criptografar com a chave fornecida.

encoding (string, opcional)

O que é: Formato de codificação da saída criptografada.

Padrão: "hex"

Valores suportados: hex, base64, base64url

Flow completo para testar:

{
  "name": "Teste ENCRYPT - Encoding",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Criptografar Base64",
        "parameters": {
          "data": "Texto secreto",
          "encoding": "base64"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Ver Resultado",
        "parameters": {
          "message": "Dados em base64: {{encrypt_1.encryptedData}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Criptografa dados e retorna em formato base64.

Parâmetros

Campo Tipo Obrigatório Descrição
data string Sim Dados a serem criptografados
algorithm string Não Algoritmo de criptografia (padrão: aes-256-cbc)
key string Não Chave de criptografia customizada (padrão: gerada automaticamente)
encoding string Não Formato de saída: hex, base64, base64url (padrão: hex)

Exemplo 1: Criptografar Dados de Usuário

Objetivo: Demonstrar criptografia de dados pessoais antes de armazenamento

JSON para Importar

{
  "name": "Criptografar Dados de Usuário",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "CPF",
        "parameters": {
          "message": "Digite seu CPF:",
          "variableName": "cpf"
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Telefone",
        "parameters": {
          "message": "Digite seu telefone:",
          "variableName": "telefone"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Criptografar CPF",
        "parameters": {
          "data": "{{cpf}}"
        }
      }
    },
    {
      "id": "encrypt_2",
      "type": "encrypt",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Criptografar Telefone",
        "parameters": {
          "data": "{{telefone}}",
          "key": "{{encrypt_1.key}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "message": "Dados criptografados e armazenados com segurança!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "input_2" },
    { "source": "input_2", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "encrypt_2" },
    { "source": "encrypt_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite seu CPF:
Usuário: 123.456.789-00
Sistema: Digite seu telefone:
Usuário: (11) 98765-4321
Sistema: Dados criptografados e armazenados com segurança!

Exemplo 2: Criptografar Arquivo JSON Completo

Objetivo: Demonstrar criptografia de estrutura JSON complexa

JSON para Importar

{
  "name": "Criptografar JSON Completo",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Criar JSON",
        "parameters": {
          "name": "dadosUsuario",
          "value": "{\"nome\": \"José Roberto\", \"cpf\": \"123.456.789-00\", \"salario\": 5000}"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Criptografar JSON",
        "parameters": {
          "data": "{{dadosUsuario}}",
          "encoding": "base64"
        }
      }
    },
    {
      "id": "variable_2",
      "type": "variable",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Salvar Chave",
        "parameters": {
          "name": "chaveCripto",
          "value": "{{encrypt_1.key}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "JSON criptografado! Chave: {{chaveCripto}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "variable_2" },
    { "source": "variable_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: JSON criptografado! Chave: a1b2c3d4e5f6...

Exemplo 3: Criptografia com Chave Compartilhada

Objetivo: Demonstrar uso de chave compartilhada entre múltiplas criptografias

JSON para Importar

{
  "name": "Criptografia com Chave Compartilhada",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Chave Mestra",
        "parameters": {
          "name": "chaveMestra",
          "value": "minhasupersecretkey1234567890abcdef1234567890abcdef"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 500, "y": 50 },
      "data": {
        "label": "Criptografar Senha",
        "parameters": {
          "data": "senha123",
          "key": "{{chaveMestra}}"
        }
      }
    },
    {
      "id": "encrypt_2",
      "type": "encrypt",
      "position": { "x": 500, "y": 150 },
      "data": {
        "label": "Criptografar Token",
        "parameters": {
          "data": "token_api_12345",
          "key": "{{chaveMestra}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Dados criptografados com a mesma chave!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "encrypt_1" },
    { "source": "variable_1", "target": "encrypt_2" },
    { "source": "encrypt_1", "target": "message_1" },
    { "source": "encrypt_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Dados criptografados com a mesma chave!

Resposta do Node

{
  "success": true,
  "action": "data_encrypted",
  "algorithm": "aes-256-cbc",
  "encoding": "hex",
  "encryptedData": "a1b2c3d4e5f6789012345678901234567890abcdef...",
  "key": "minhasupersecretkey1234567890abcdef1234567890abcdef",
  "iv": "fedcba0987654321fedcba0987654321",
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Boas Práticas

SIM:

  • Sempre armazene a chave de criptografia em local seguro (variáveis de ambiente, vault)
  • Use AES-256-CBC para máxima segurança
  • Guarde o IV (vetor de inicialização) junto com os dados criptografados
  • Use a mesma chave para criptografar e descriptografar
  • Criptografe dados pessoais antes de armazenar no banco de dados
  • Use encoding base64 para armazenamento em JSON

NÃO:

  • Não perca a chave de criptografia (dados não poderão ser recuperados)
  • Não use chaves curtas ou previsíveis
  • Não armazene chave junto com dados criptografados
  • Não reutilize chaves entre diferentes sistemas
  • Não exponha chaves em logs ou mensagens de erro
  • Não use criptografia para hash de senhas (use bcrypt/argon2)

Dicas

💡 Dica 1: Combine ENCRYPT com VARIABLE para armazenar chaves de criptografia de forma segura no contexto do flow

💡 Dica 2: Use o mesmo valor de key e iv no node DECRYPT para recuperar os dados originais

💡 Dica 3: Para dados que precisam ser pesquisáveis, considere criptografar apenas campos sensíveis, não o registro inteiro

💡 Dica 4: Use encoding "base64" quando for armazenar dados criptografados em JSON ou banco de dados

💡 Dica 5: Implemente rotação de chaves periodicamente para maior segurança

Próximo Node

DECRYPT - Descriptografar dados criptografados → AUTH - Autenticação e gerenciamento de sessão → TOKEN - Gerenciamento de tokens JWT