Estoy desarrollando un servicio que incluirá el débito directo de las cuentas de los clientes de forma rutinaria (semanal, mensual, etc.), por lo que necesitaré almacenar su información (BSB / número de ruta y número de cuenta) en mi base de datos Estoy muy preocupado por la seguridad, por lo que mi primer pensamiento fue no almacenar esta información, pero después de leer muchas otras preguntas sobre este tema, se me ocurrió una solución que creo que funcionará, pero me gustaría hacerla funcionar. Más allá de ustedes, asegúrese de que no haya dejado ningún agujero de seguridad abierto.
Cuando un usuario se registra en el servicio, creará un par de claves pública / privada con la clave privada que tiene una frase de contraseña que proporciona el usuario (la contraseña de su cuenta). La contraseña se oculta con bcrypt y las claves pública y privada se almacenan junto con el hash de contraseña en la tabla de usuarios.
También estableceré un único par de claves públicas / privadas que se utilizarán cuando necesitemos procesar un débito directo. La aplicación y la base de datos conocerán la clave pública, pero la clave privada se mantendrá fuera del servidor, de modo que los datos solo podrán descargarse cuando estén cifrados y luego procesados en otro lugar. Una alternativa a la descarga cuando está cifrada sería, en cambio, cargar la clave privada a la aplicación, descifrar los datos solo para esa solicitud y luego eliminar la clave privada cargada. ¿Es esto un agujero de seguridad?
Cuando un usuario se registra para débito directo, el servicio tomará la clave pública del usuario y la clave pública del administrador, y las cifrará usando función de múltiples destinatarios de GPG .
Según mi conocimiento, esto cubre las siguientes situaciones:
- Si el usuario desea ver los datos, deberá proporcionar su contraseña para descifrar la información.
- Si el usuario desea agregar más datos, no tendrá que proporcionar su contraseña, ya que solo uso su clave pública.
- Si el administrador desea ver los datos, deberá descargar la información y descifrarla, o bien cargar su clave privada (ver más arriba).
- Si el usuario cambia su contraseña, solo necesitaré actualizar su clave privada. Si han olvidado su contraseña, la única forma en que podría descifrar sus datos sería a través de la clave privada del administrador, pero como esta se mantiene fuera del sitio, los datos deben eliminarse.
¿Habrá alguna preocupación si el par de claves de administración alguna vez se comprometa (aparte de lo obvio) y necesito generar un nuevo par de claves de administración y luego volver a cifrar todos los datos almacenados?
¿Hay agujeros de seguridad en este diseño? Reconozco que no soy un experto, pero he intentado hacer mi mejor esfuerzo investigando esto, y ahora me encantaría recibir alguna información.
También he consultado servicios como Gerente de Información del Cliente (CIM) de Authorize.net pero hasta donde llego puede ver que necesita utilizar su servicio para cobrar los pagos, cuando en cambio ya hemos establecido nuestro propio comerciante para que lo haga a una tarifa más barata, por lo que solo necesitamos un servicio de almacenamiento de información seguro.
El servicio utilizará HTTPS y se ejecutará en Ubuntu 12.04, con PHP y MySQL, si eso ayuda.
¡Cualquier consejo que puedas dar será muy apreciado!
Gracias