Tu correo está seguro

Entendemos que conectar tu correo es una decisión importante. Aquí te explicamos exactamente cómo protegemos tu información.

Filtrado de correos IMAP

Solo buscamos correos de remitentes específicos de Vinted. El filtro IMAP se aplica directamente en el servidor, lo que significa que nunca descargamos ni procesamos correos que no sean de Vinted.

imapService.js - Filtro de remitentes
// Búsqueda IMAP - el filtro se ejecuta en el servidor
const searchCriteria = [
  ['OR',
    ['FROM', 'no-reply@vinted.'],
    ['FROM', 'noreply@vinted.']
  ]
];

// Solo se descargan correos que coincidan con el filtro
// Funciona con todos los dominios: .es, .com, .nl, .fr, etc.
const messages = await connection.search(searchCriteria, {
  bodies: ['HEADER', 'TEXT'],
  struct: true
});

Resultado: Si tienes 10,000 correos en tu bandeja de entrada, solo descargamos los ~50-100 que son de Vinted. El resto nunca sale de tu servidor de correo.

Encriptación de credenciales

Tu contraseña de aplicación se encripta con AES-256-GCM, el mismo estándar usado por bancos y agencias gubernamentales. La clave de encriptación se almacena en variables de entorno del servidor, separada de la base de datos.

encryption.js - Encriptación AES-256-GCM
const crypto = require('crypto');

const ALGORITHM = 'aes-256-gcm';
const IV_LENGTH = 16;        // Vector de inicialización aleatorio
const AUTH_TAG_LENGTH = 16;  // Tag de autenticación

function encrypt(text) {
  // Clave de 256 bits desde variable de entorno
  const key = Buffer.from(process.env.ENCRYPTION_KEY, 'hex');

  // IV aleatorio para cada encriptación
  const iv = crypto.randomBytes(IV_LENGTH);

  const cipher = crypto.createCipheriv(ALGORITHM, key, iv, {
    authTagLength: AUTH_TAG_LENGTH
  });

  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');

  // Almacenamos: IV + AuthTag + DatosEncriptados
  const authTag = cipher.getAuthTag();
  return iv.toString('hex') + ':' +
         authTag.toString('hex') + ':' +
         encrypted;
}

// La contraseña NUNCA se almacena en texto plano
// Ejemplo de dato almacenado en Firestore:
// "a1b2c3d4e5f6...:9f8e7d6c5b4a...:7c8d9e0f1a2b..."

ALGORITMO

AES-256-GCM

LONGITUD CLAVE

256 bits

IV

Aleatorio por operación

Conexión IMAP segura

Todas las conexiones a tu servidor de correo se realizan sobre TLS/SSL. Esto significa que los datos viajan encriptados entre nuestro servidor y tu proveedor de correo.

imapService.js - Conexión TLS
const Imap = require('imap');

// Configuración de conexión segura
const imapConfig = {
  host: 'imap.gmail.com',  // o tu servidor IMAP
  port: 993,               // Puerto IMAP sobre SSL
  tls: true,               // TLS obligatorio
  tlsOptions: {
    rejectUnauthorized: true,  // Verificar certificado
    minVersion: 'TLSv1.2'      // Mínimo TLS 1.2
  },
  authTimeout: 30000,
  connTimeout: 30000
};

// La conexión se establece sobre SSL/TLS
// Todos los datos viajan encriptados
const connection = new Imap({
  user: userEmail,
  password: decrypt(encryptedAppPassword), // Desencriptamos solo en memoria
  ...imapConfig
});

// El password desencriptado NUNCA se guarda en logs
// NUNCA se almacena en disco
// Solo existe en memoria durante la conexión

Puerto 993 + TLS: Es el estándar de la industria para conexiones IMAP seguras. El mismo que usa tu cliente de correo (Outlook, Apple Mail, etc).

Lo que NO almacenamos

Solo extraemos la información estructurada que necesitas. El contenido completo del correo se procesa en memoria y se descarta inmediatamente.

emailParser.js - Extracción de datos
// Procesamos el correo y extraemos SOLO lo necesario
function parseVintedEmail(emailContent) {

  // Extraemos datos estructurados
  const saleData = {
    itemName: extractItemName(emailContent),
    price: extractPrice(emailContent),
    buyer: extractBuyerName(emailContent),
    date: extractDate(emailContent),
    carrier: extractCarrier(emailContent)
  };

  // El contenido del correo se descarta aquí
  // emailContent = null (garbage collected)

  return saleData;  // Solo guardamos esto
}

// Lo que guardamos en Firestore:
{
  itemName: "Camiseta Nike",
  price: 15.00,
  buyer: "usuario123",
  date: "2025-01-15",
  carrier: "Correos"
}

// Lo que NO guardamos:
// - HTML completo del correo
// - Cabeceras del correo
// - Otros datos del mensaje
// - Correos de otros remitentes
Contenido HTML de correos
Correos personales o de trabajo
Cabeceras completas de email
Tu contraseña en texto plano
Solo datos estructurados de ventas Vinted

Contraseña de aplicación vs contraseña principal

Usamos contraseñas de aplicación, un sistema de seguridad diseñado por Google/Microsoft que te da control total sobre el acceso de terceros.

Contraseña de aplicación

  • Clave única de 16 caracteres
  • Solo acceso IMAP (lectura)
  • Revocable en cualquier momento
  • No da acceso a tu cuenta Google
  • Visible en tu panel de seguridad

Contraseña principal

  • Acceso total a tu cuenta
  • Puede cambiar configuración
  • Puede eliminar datos
  • Si se filtra, pierdes todo
  • NUNCA la pedimos

Para revocar acceso: Ve a myaccount.google.com/apppasswords y elimina la contraseña de Vintax. El acceso se revoca instantáneamente.

Infraestructura

G

Firebase (Google Cloud)

Base de datos Firestore, Authentication, Storage. Región europe-west. Certificaciones ISO 27001, SOC 2/3.

R

Railway

Backend Node.js. Región EU-West. HTTPS obligatorio. Variables de entorno encriptadas.

S

Stripe

Procesamiento de pagos. PCI-DSS Level 1. NO almacenamos datos de tarjetas.

Política de privacidadTérminos y condicionesAviso legalContacto
Volver al inicio