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:
- Segurança de Dados: Proteger informações sensíveis como senhas, dados pessoais, e informações financeiras
- Conformidade Legal: Atender requisitos de LGPD, GDPR e outras regulamentações de proteção de dados
- Criptografia Simétrica: Usar algoritmos robustos como AES-256 para garantir segurança
- Flexibilidade: Suportar diferentes algoritmos e encodings conforme necessidade
- Integridade: Garantir que dados possam ser descriptografados apenas com a chave correta
Como funciona internamente?
Quando o ENCRYPT é executado, o sistema:
- Recebe os dados: Captura o texto ou dados a serem criptografados
- Gera ou usa chave: Utiliza chave fornecida ou gera uma nova chave de 32 bytes
- Gera IV: Cria um vetor de inicialização (IV) aleatório de 16 bytes
- Criptografa: Usa o algoritmo especificado (padrão AES-256-CBC) para criptografar
- Codifica: Converte resultado para encoding especificado (padrão hexadecimal)
- 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
- Armazenamento Seguro: "Preciso criptografar senhas antes de salvar no banco de dados"
- Transmissão Segura: "Preciso criptografar dados antes de enviar via API"
- Dados Pessoais: "Preciso proteger CPF, RG e dados bancários dos usuários"
- Informações Financeiras: "Preciso criptografar números de cartão de crédito"
- 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