Estamos desarrollando una aplicación web en la que ciertos usuarios no registrados (clientes) deben enviar los datos de su tarjeta de crédito a otros usuarios (comerciantes), que, suponemos, son compatibles con PCI.
Estamos estudiando el cumplimiento de PCI, pero el proceso seguramente necesitará mucho tiempo. Por lo tanto, estamos investigando otras soluciones que no requieren que obtengamos una certificación y nos protegen contra el robo de datos razonables.
Nuestro plan es:
- Haga que el comerciante genere una clave privada y pública
- Almacene la clave privada dentro de su navegador usando localstorage (y proporcione un medio para hacer una copia de seguridad)
- Proporcione la clave pública en el formulario utilizado por un cliente
- Antes de que el cliente envíe los datos, cifre todo con la clave pública del comerciante
- Almacene los datos cifrados en nuestro servidor
- Proporcione los datos cifrados al comerciante
- Haga que el comerciante descifre los datos en su navegador usando su clave privada
La idea era utilizar JavaScript y la biblioteca jsencrypt .
¿Ve problemas de seguridad en este flujo de trabajo? ¿Crees que todavía necesitamos el cumplimiento de PCI cuando empleamos un sistema así? El razonamiento es que, para cualquier persona sin la clave privada, esos son solo bytes aleatorios.
El único ataque que se me ocurre es que alguien esté comprometiendo el servidor y reemplazando una clave pública de comerciante con su propia clave. Pero también podría robar una ficha para otra pasarela de pago y falsificar la comunicación necesaria para hacer algo desagradable.
Sabemos de servicios como Paymill, Braintree y Stripe (que ofrecen bibliotecas bastante buenas para el cliente) pero no son adecuados para nuestra solución (o mejor: son alternativas que pondremos a disposición de los comerciantes, pero deberían depender de ellos para decidir).
Gracias de antemano
EDIT: Estoy totalmente de acuerdo con ustedes y prefiero trabajar con soluciones de terceros.
El problema es que estamos trabajando en un mercado en el que la mayoría de nuestros competidores son pequeñas empresas que trabajan sin el cumplimiento de PCI (¡y la mayoría de ellos incluso sin HTTPS!). Nuestros competidores simplemente reciben datos de CC, los almacenan y dan acceso a los usuarios.
Sabemos acerca de los riesgos de este enfoque, pero los usuarios no lo hacen y prefieren sus soluciones a las nuestras porque prefieren tener toda la información de CC, en lugar de solo tener botones para ejecutar acciones.