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:
- Recuperação de Dados: Restaurar dados criptografados ao formato original para uso na aplicação
- Leitura Segura: Permitir acesso autorizado a informações protegidas
- Integridade: Garantir que apenas quem possui a chave correta pode acessar os dados
- Flexibilidade: Suportar diferentes algoritmos e encodings usados na criptografia
- Validação: Falhar caso chave ou dados estejam incorretos, protegendo contra acessos não autorizados
Como funciona internamente?
Quando o DECRYPT é executado, o sistema:
- Recebe dados criptografados: Captura os dados criptografados e a chave
- Valida parâmetros: Verifica se dados criptografados e chave foram fornecidos
- Configura decipher: Cria objeto de descriptografia com algoritmo, chave e IV
- Descriptografa: Processa os dados do encoding especificado para texto UTF-8
- Se chave correta: Retorna dados descriptografados com sucesso
- 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
- Leitura de Dados Pessoais: "Preciso descriptografar CPF armazenado no banco de dados"
- Recuperação de Credenciais: "Preciso descriptografar API keys para fazer requisições"
- Dados Financeiros: "Preciso descriptografar número de cartão para processar pagamento"
- Informações Confidenciais: "Preciso acessar dados médicos criptografados"
- 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