Seguridad y Privacidad

Tu información está protegida en cada capa de la plataforma.

JWT + bcrypt

🔐
JWT HS256
Tokens firmados con HMAC-SHA256. El taller_id viaja dentro del token — infalsificable. Expiración 8 horas.
🔒
bcrypt
Contraseñas hasheadas con bcrypt (costo 10). Nunca se guardan en texto plano.
🔄
Sesión Única por App
Cada app (Ventas/Kiosco/Pizarrón) tiene su propia sesión. Usar en distintos dispositivos sin conflicto.

Multi-tenant

CapaMecanismo de aislamiento
JWTtaller_id dentro del token firmado — el cliente no puede modificarlo
APItaller_id extraído del JWT verificado — nunca del body del request
Base de DatosWHERE taller_id = ? en todas las queries (SELECT, INSERT, UPDATE, DELETE)
Sessionsession_ventas, session_kiosco, session_pizarron por taller — independientes
✅ Verificado en producción: Peddaleo (taller_id=1) y Superbicis (taller_id=16) ven datos completamente separados.

Fase 1 Anti-Piratería

VulnerabilidadSolución implementada
DOM expuesto (visibility:hidden bypasseable)Script síncrono en <head> + overlay bloqueante
.catch() en verificarSesion() daba acceso sin internetjwtExpired() decodifica JWT localmente. Sin conexión solo si token no expiró
peddaleo_trial_start en localStorage (reseteable)trial_days_remaining calculado en servidor, enviado en JWT
peddaleo_login_time en localStorage (manipulable)Movido a sessionStorage — muere al cerrar pestaña
Sin verificación de expiración del JWT en clientejwtExpired() decodifica token y verifica exp localmente

Recomendaciones

🔑
Cambia tu contraseña
Usa contraseñas seguras (mínimo 8 caracteres, mayúsculas, números, símbolos).
🚪
Cierra sesión
Al terminar tu jornada, cierra la pestaña — la sesión expira automáticamente.
📱
Un dispositivo por app
Si abres la misma app en otro dispositivo, el anterior se cierra automáticamente.
⚠️ Nunca compartas tus credenciales. Cada taller tiene su propio usuario y contraseña.