Seguridad del proxy de descifrado asimétrico

2

Estoy pensando en la forma más segura posible de almacenar datos seguros (por ejemplo, números de tarjeta de crédito) con el requisito de enviarlos en texto sin cifrar a la API de terceros (para que el hashing no entre en juego).

Llegué a una solución que parece ser más segura que la típica 'almacenarlos encriptados y descifrarlos cuando tenga que usarlos con la misma clave'.

La idea es cifrarlo y almacenarlo en el servidor de aplicaciones directamente después de obtenerlo del usuario con una clave pública.

La clave privada no se almacenaría en el servidor de aplicaciones en absoluto. En su lugar, el servidor de aplicaciones enviaría el mensaje a la API de terceros utilizando los valores cifrados.

La segunda parte de la solución sería un Proxy HTTP en un servidor separado que enrutaría los mensajes a la API de terceros y descifraría los valores cifrados. La clave privada se almacenaría solo en el proxy y no se almacenaría en el disco (solo en la RAM; cada reinicio requeriría ingresar la clave privada).

Parece que usar el proxy como una caja negra que no tendría que cambiar a pesar del desarrollo de la aplicación ayudaría a protegerlo mejor que el servidor de la aplicación (al que más personas tienen que tener acceso). Además, debido al requisito de no almacenar la clave privada en el disco, no sería un problema introducir la clave después de cada reinicio del servidor proxy, ya que no tendría que reiniciarse tan frecuentemente como una máquina servidor de aplicaciones. .

¿Alguna idea sobre las ventajas y desventajas de tal solución? ¿Hay alguna aplicación que pueda ayudarme a lograrlo (proxy con capacidad de usar código de transformación personalizado, método de almacenamiento seguro de valores en la RAM)?

    
pregunta deadbeef 05.06.2012 - 16:11
fuente

2 respuestas

1

Citando al Karate Kid, "Recuerda, el mejor bloque no está allí". (Gracias a Bill Cheswick por esta cita). En otras palabras, la forma más segura de almacenar una tarjeta de crédito de manera segura es ... (espérelo ...) no la guarde en absoluto. Use un procesador de tarjeta de crédito de terceros que almacene los números de la tarjeta de crédito para usted, para que no tenga que hacerlo. Pueden darte un identificador que puedes usar en su lugar.

Alternativamente, puedes construir tu propio servicio. Cree un proxy simple que almacene el número de la tarjeta de crédito de forma segura, en su propia base de datos, encriptado, utilizando una clave de cifrado que no conoce el resto de su código. El proxy puede proporcionar una API. Cuando un usuario registra su cuenta, usted envía su número de tarjeta de crédito al proxy para su almacenamiento. Cuando un usuario realiza un pago, envía un mensaje al proxy: 'cargue $ 27 a la tarjeta de crédito del usuario xyz', y el proxy es responsable de recuperar el número de la tarjeta de crédito e iniciar la transacción con el procesador de su tarjeta de crédito. Refuerce el servicio que utiliza para almacenar números de tarjetas de crédito y considere iniciar algunos procedimientos de auditoría o limitación de velocidad. De esta manera, si el resto de su código está comprometido, al menos los atacantes no pueden robar todos los números de tarjetas de crédito de sus usuarios.

Ver también ¿Cómo puedo crear un servicio que inicie sesión automáticamente en un servicio de terceros sin almacenar las credenciales en texto sin formato? [que pregunta sobre el almacenamiento seguro de una contraseña, pero puede aplicar las mismas técnicas para almacenar un número de tarjeta de crédito], Almacenamiento de números de tarjetas de crédito , y ¿Almacenar tarjetas de crédito para pagos automáticos? .

    
respondido por el D.W. 06.06.2012 - 06:20
fuente
0

Un mejor enfoque podría ser el uso de un dispositivo HSM para el cifrado de los datos de la tarjeta de crédito del usuario en una base de datos independiente. Muchos HSM le proporcionan una función de cifrado a nivel de columna de la base de datos donde el desarrollo de módulos seguros facilitará un nivel muy alto. No será necesario que tenga claves asimétricas, en su lugar, el HSM puede generar claves simétricas para cada usuario y esas claves serán protegidas por el mundo de seguridad de HSM. Además, para tener una seguridad de alto nivel, puede proteger los datos cifrados mediante una frase de desafío creada por el usuario final (el titular de la tarjeta). El túnel SSL se puede hacer a través del HSM directamente para la validación del desafío. De esta manera, la infraestructura tampoco conocerá el desafío y los detalles de la tarjeta de usuario.

    
respondido por el Mohit Sethi 06.06.2012 - 08:23
fuente

Lea otras preguntas en las etiquetas