La empresa para la que trabajo necesita un sistema para realizar cargos mensuales de tarjeta de crédito a las cuentas de los clientes. Los clientes podrán actualizar la información de su tarjeta de crédito desde una interfaz en línea escrita en PHP (que se presentará a través de HTTP a través de SSL). Los cargos mensuales se ejecutarán manualmente a través de un área de administración protegida por contraseña de la misma interfaz, que básicamente equivaldrá a una llamada por lotes a la API de Authorize.Net.
Mis compañeros de trabajo desean almacenar la información de la tarjeta de crédito (encriptada) en una base de datos MySQL. Planean encriptar los números de las tarjetas de crédito con extensión mcrypt de PHP , probablemente usando Rijndael / AES o Twofish. El tema de la administración de claves se pasó por alto, pero se mencionaron las siguientes dos opciones:
-
almacenar claves en la base de datos, con una clave separada para cada entrada de tarjeta de crédito; o
-
almacenar una única clave de cifrado para todas las entradas de tarjeta de crédito en un archivo PHP como una variable (similar a cómo las aplicaciones PHP como WordPress y MediaWiki almacenan las credenciales de la base de datos).
¿Cómo puedo convencerlos de que no sigan esta ruta? Utilizaremos Authorize.net para proceso de pago, así que mencioné su servicio Customer Information Manager como una alternativa para almacenar la información de la tarjeta de crédito por nosotros mismos. Sin embargo, no conozco el tema lo suficientemente bien como para presentar un argumento convincente (mis argumentos eran "ninguno de nosotros es experto en seguridad" y "no me sentiría cómodo con una compañía que almacene la información de mi tarjeta de crédito de esta manera").
Si no puedo convencerlos de usar un servicio de terceros como Customer Information Manager , ¿qué debo tener en cuenta para conservar la información de la tarjeta de crédito de los clientes? ¿seguro? En particular, ¿cómo debo gestionar las claves de cifrado? ¿Debería haber una clave de cifrado separada para cada entrada de cliente? ¿Dónde puedo almacenar las claves para poder descifrar la información de la tarjeta de crédito antes de enviar las transacciones a Authorize.Net? Las dos opciones mencionadas anteriormente no me parecen muy acertadas (pero, una vez más, no conozco el tema lo suficientemente bien como para presentar un argumento convincente en contra de cualquiera).
Actualización : encontré a alguien en la empresa familiarizado con el cumplimiento de PCI DSS, así que estoy trabajando con él para asegurarme de que esto se haga correctamente. Sin embargo, todavía apreciaría las respuestas a mis preguntas anteriores (tanto para mejorar mi conocimiento como para ayudar a otros en una situación similar).
Actualización 2 : ¡Éxito! Otro desarrollador se sentó y leyó la guía de PCI DSS y decidió que, después de todo, es una mala idea almacenar la información nosotros mismos. Utilizaremos el servicio Customer Information Manager de Authorize.Net
.