Pular para conteúdo

DECRYPT - Descriptografia de Dados

O que é este Node?

O DECRYPT é o node responsável por descriptografar dados previamente criptografados no Lumina Flow Builder. Ele reverte o processo de criptografia, recuperando os dados originais.

Por que este Node existe?

Dados criptografados precisam ser descriptografados para uso. O DECRYPT existe para:

  1. Recuperação de Dados: Restaurar dados criptografados ao formato original para uso na aplicação
  2. Leitura Segura: Permitir acesso autorizado a informações protegidas
  3. Integridade: Garantir que apenas quem possui a chave correta pode acessar os dados
  4. Flexibilidade: Suportar diferentes algoritmos e encodings usados na criptografia
  5. Validação: Falhar caso chave ou dados estejam incorretos, protegendo contra acessos não autorizados

Como funciona internamente?

Quando o DECRYPT é executado, o sistema:

  1. Recebe dados criptografados: Captura os dados criptografados e a chave
  2. Valida parâmetros: Verifica se dados criptografados e chave foram fornecidos
  3. Configura decipher: Cria objeto de descriptografia com algoritmo, chave e IV
  4. Descriptografa: Processa os dados do encoding especificado para texto UTF-8
  5. Se chave correta: Retorna dados descriptografados com sucesso
  6. Se chave incorreta: Lança erro indicando falha na descriptografia

Código interno (security-executor.service.ts:118-145):

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

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

  if (!encryptedData || !key) {
    throw new Error('Encrypted data and key are required for decryption');
  }

  try {
    const algorithm_name = algorithm || 'aes-256-cbc';
    const decipher = crypto.createDecipheriv(algorithm_name, Buffer.from(key.slice(0, 32)), Buffer.alloc(16));

    let decrypted = decipher.update(encryptedData, encoding || 'hex', 'utf8');
    decrypted += decipher.final('utf8');

    return {
      success: true,
      action: 'data_decrypted',
      algorithm: algorithm || 'aes-256-cbc',
      encoding: encoding || 'hex',
      decryptedData: decrypted,
      timestamp: new Date().toISOString()
    };
  } catch (error) {
    throw new Error(`Decryption failed: ${error.message}`);
  }
}

Quando você DEVE usar este Node?

Use DECRYPT sempre que precisar de recuperar dados criptografados:

Casos de uso

  1. Leitura de Dados Pessoais: "Preciso descriptografar CPF armazenado no banco de dados"
  2. Recuperação de Credenciais: "Preciso descriptografar API keys para fazer requisições"
  3. Dados Financeiros: "Preciso descriptografar número de cartão para processar pagamento"
  4. Informações Confidenciais: "Preciso acessar dados médicos criptografados"
  5. Validação de Integridade: "Preciso descriptografar para verificar se dados não foram alterados"

Quando NÃO usar DECRYPT

  • Verificação de Senha: Use funções de hash (bcrypt) ao invés de descriptografia
  • Validação de Token: Use TOKEN ao invés de DECRYPT
  • Dados Públicos: Não criptografe dados que não precisam de proteção

Parâmetros Detalhados

encryptedData (string, obrigatório)

O que é: Dados criptografados que serão descriptografados. Deve estar no encoding especificado (hex, base64).

Flow completo para testar:

{
  "name": "Teste DECRYPT - Encrypted Data",
  "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",
        "parameters": {
          "data": "Dados secretos"
        }
      }
    },
    {
      "id": "decrypt_1",
      "type": "decrypt",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Descriptografar",
        "parameters": {
          "encryptedData": "{{encrypt_1.encryptedData}}",
          "key": "{{encrypt_1.key}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Dados descriptografados: {{decrypt_1.decryptedData}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "decrypt_1" },
    { "source": "decrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Criptografa e depois descriptografa dados. Deve retornar "Dados secretos".

key (string, obrigatório)

O que é: Chave de criptografia usada originalmente para criptografar os dados. DEVE ser exatamente a mesma chave.

Flow completo para testar:

{
  "name": "Teste DECRYPT - 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": "chaveMestra",
          "value": "minhasupersecretkey1234567890abcdef1234567890abcdef"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Criptografar",
        "parameters": {
          "data": "Informação confidencial",
          "key": "{{chaveMestra}}"
        }
      }
    },
    {
      "id": "decrypt_1",
      "type": "decrypt",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Descriptografar",
        "parameters": {
          "encryptedData": "{{encrypt_1.encryptedData}}",
          "key": "{{chaveMestra}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Verificar",
        "parameters": {
          "message": "Descriptografado: {{decrypt_1.decryptedData}}"
        }
      }
    },
    {
      "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": "decrypt_1" },
    { "source": "decrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Usa mesma chave para criptografar e descriptografar. Deve recuperar dados originais.

algorithm (string, opcional)

O que é: Algoritmo usado na criptografia original. DEVE ser o mesmo usado no ENCRYPT.

Padrão: "aes-256-cbc"

Flow completo para testar:

{
  "name": "Teste DECRYPT - 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",
        "parameters": {
          "data": "Teste de algoritmo",
          "algorithm": "aes-256-cbc"
        }
      }
    },
    {
      "id": "decrypt_1",
      "type": "decrypt",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Descriptografar",
        "parameters": {
          "encryptedData": "{{encrypt_1.encryptedData}}",
          "key": "{{encrypt_1.key}}",
          "algorithm": "aes-256-cbc"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "message": "Algoritmo usado: {{decrypt_1.algorithm}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "decrypt_1" },
    { "source": "decrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Usa mesmo algoritmo para criptografar e descriptografar. Deve funcionar corretamente.

encoding (string, opcional)

O que é: Formato de codificação dos dados criptografados. DEVE ser o mesmo usado no ENCRYPT.

Padrão: "hex"

Valores suportados: hex, base64, base64url

Flow completo para testar:

{
  "name": "Teste DECRYPT - 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": "Teste de encoding",
          "encoding": "base64"
        }
      }
    },
    {
      "id": "decrypt_1",
      "type": "decrypt",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Descriptografar Base64",
        "parameters": {
          "encryptedData": "{{encrypt_1.encryptedData}}",
          "key": "{{encrypt_1.key}}",
          "encoding": "base64"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Descriptografado: {{decrypt_1.decryptedData}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "decrypt_1" },
    { "source": "decrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Criptografa em base64 e descriptografa em base64. Deve recuperar dados originais.

Parâmetros

Campo Tipo Obrigatório Descrição
encryptedData string Sim Dados criptografados a serem descriptografados
key string Sim Chave usada na criptografia original
algorithm string Não Algoritmo usado (padrão: aes-256-cbc)
encoding string Não Encoding dos dados: hex, base64, base64url (padrão: hex)

Exemplo 1: Ciclo Completo de Criptografia e Descriptografia

Objetivo: Demonstrar fluxo completo de proteção e recuperação de dados

JSON para Importar

{
  "name": "Ciclo Completo Cripto/Descripto",
  "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": "Dados Originais",
        "parameters": {
          "message": "Digite dados sensíveis:",
          "variableName": "dadosOriginais"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar Original",
        "parameters": {
          "message": "Original: {{dadosOriginais}}"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Criptografar",
        "parameters": {
          "data": "{{dadosOriginais}}"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Mostrar Criptografado",
        "parameters": {
          "message": "Criptografado: {{encrypt_1.encryptedData}}"
        }
      }
    },
    {
      "id": "decrypt_1",
      "type": "decrypt",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Descriptografar",
        "parameters": {
          "encryptedData": "{{encrypt_1.encryptedData}}",
          "key": "{{encrypt_1.key}}"
        }
      }
    },
    {
      "id": "message_3",
      "type": "message",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Mostrar Descriptografado",
        "parameters": {
          "message": "Descriptografado: {{decrypt_1.decryptedData}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "message_1" },
    { "source": "message_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "message_2" },
    { "source": "message_2", "target": "decrypt_1" },
    { "source": "decrypt_1", "target": "message_3" },
    { "source": "message_3", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite dados sensíveis:
Usuário: Minha senha secreta
Sistema: Original: Minha senha secreta
Sistema: Criptografado: a1b2c3d4e5f6...
Sistema: Descriptografado: Minha senha secreta

Exemplo 2: Descriptografar Múltiplos Campos

Objetivo: Demonstrar descriptografia de vários campos com mesma chave

JSON para Importar

{
  "name": "Descriptografar Múltiplos Campos",
  "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": "chave",
          "value": "minhasupersecretkey1234567890abcdef1234567890abcdef"
        }
      }
    },
    {
      "id": "encrypt_1",
      "type": "encrypt",
      "position": { "x": 500, "y": 50 },
      "data": {
        "label": "Criptografar CPF",
        "parameters": {
          "data": "123.456.789-00",
          "key": "{{chave}}"
        }
      }
    },
    {
      "id": "encrypt_2",
      "type": "encrypt",
      "position": { "x": 500, "y": 150 },
      "data": {
        "label": "Criptografar Cartão",
        "parameters": {
          "data": "1234 5678 9012 3456",
          "key": "{{chave}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Dados Protegidos",
        "parameters": {
          "message": "Dados criptografados e armazenados!"
        }
      }
    },
    {
      "id": "decrypt_1",
      "type": "decrypt",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Recuperar CPF",
        "parameters": {
          "encryptedData": "{{encrypt_1.encryptedData}}",
          "key": "{{chave}}"
        }
      }
    },
    {
      "id": "decrypt_2",
      "type": "decrypt",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Recuperar Cartão",
        "parameters": {
          "encryptedData": "{{encrypt_2.encryptedData}}",
          "key": "{{chave}}"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Mostrar Dados",
        "parameters": {
          "message": "CPF: {{decrypt_1.decryptedData}}\nCartão: {{decrypt_2.decryptedData}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "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": "decrypt_1" },
    { "source": "message_1", "target": "decrypt_2" },
    { "source": "decrypt_1", "target": "message_2" },
    { "source": "decrypt_2", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Dados criptografados e armazenados!
Sistema: CPF: 123.456.789-00
Cartão: 1234 5678 9012 3456

Exemplo 3: Validação de Chave Incorreta

Objetivo: Demonstrar comportamento quando chave está incorreta

JSON para Importar

{
  "name": "Validação de Chave Incorreta",
  "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",
        "parameters": {
          "data": "Dados protegidos"
        }
      }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Chave Errada",
        "parameters": {
          "name": "chaveErrada",
          "value": "chaveerradaerradaerradaerradaerradaerradaerrada1234"
        }
      }
    },
    {
      "id": "decrypt_1",
      "type": "decrypt",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Tentar Descriptografar",
        "parameters": {
          "encryptedData": "{{encrypt_1.encryptedData}}",
          "key": "{{chaveErrada}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Erro",
        "parameters": {
          "message": "Erro ao descriptografar (chave incorreta)"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "encrypt_1" },
    { "source": "encrypt_1", "target": "variable_1" },
    { "source": "variable_1", "target": "decrypt_1" },
    { "source": "decrypt_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Erro ao descriptografar (chave incorreta)

Resposta do Node

Descriptografia bem-sucedida:

{
  "success": true,
  "action": "data_decrypted",
  "algorithm": "aes-256-cbc",
  "encoding": "hex",
  "decryptedData": "Meus dados originais",
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Descriptografia falhou:

{
  "error": "Decryption failed: wrong final block length"
}

Boas Práticas

SIM:

  • Sempre use a MESMA chave usada na criptografia original
  • Use o MESMO algoritmo e encoding do ENCRYPT
  • Valide se a descriptografia foi bem-sucedida antes de usar os dados
  • Armazene chaves em local seguro (variáveis de ambiente, vault)
  • Use try-catch para lidar com erros de chave incorreta
  • Limite acesso à chave de descriptografia apenas para usuários autorizados

NÃO:

  • Não tente descriptografar com chave diferente da original
  • Não ignore erros de descriptografia
  • Não exponha mensagens de erro detalhadas ao usuário final
  • Não armazene chaves junto com dados criptografados
  • Não use chaves curtas ou previsíveis
  • Não compartilhe chaves entre diferentes sistemas

Dicas

💡 Dica 1: Sempre armazene a chave de criptografia do ENCRYPT em uma variável para usar no DECRYPT posteriormente

💡 Dica 2: Use CONDITION após DECRYPT para validar se a descriptografia foi bem-sucedida antes de continuar o flow

💡 Dica 3: Para sistemas em produção, busque chaves de descriptografia de um vault seguro, não de variáveis hardcoded

💡 Dica 4: Se precisar descriptografar múltiplos campos, use a mesma chave para todos (chave mestra)

💡 Dica 5: Implemente logs de auditoria para rastrear quando dados sensíveis são descriptografados

Próximo Node

ENCRYPT - Criptografar dados sensíveis → AUTH - Autenticação e gerenciamento de sessão → TOKEN - Gerenciamento de tokens JWT