Almacenamiento de información confidencial en DB con claves asimétricas públicas / privadas

0

Necesito almacenar la información confidencial de un usuario en un sitio web (como SSN) en una base de datos. Estos datos no pueden ser un hash unidireccional. Los datos, una vez ingresados en db, nunca se enviarán de nuevo a un sitio web ni a nadie que no sea de confianza, pero se pueden enviar a través de un servidor a otra API confiable, por lo que debo poder leerlos.

Supongamos que tenemos controles de acceso adecuados, que las claves se almacenan / administran adecuadamente y que toda la información se transmite de forma segura a través de HTTPS.

Por lo que he leído en línea, el método que parece tener más sentido es utilizar un cifrado de clave asimétrico público / privado. Entonces:

  1. Generar una clave pública / privada
  2. Dar la clave pública al cliente
  3. Cifre los datos con una clave pública en el cliente y envíelos al servidor
  4. Almacena datos encriptados en DB
  5. Descodificar con clave privada cuando sea necesario

Algunas preguntas:

  • ¿Me faltan pasos aquí o entiendo mal algo?
  • ¿Necesito generar una nueva clave pública para cada usuario en mi sitio web? ¿O está bien usar la misma clave pública cada vez que un usuario me envía un SSN?
  • ¿Está bien almacenar los datos cifrados públicamente directamente en la base de datos? ¿O hay algo más que deba hacer antes de almacenarlo?

¡Gracias!

    
pregunta wlingke 12.12.2016 - 21:31
fuente

3 respuestas

2

El uso de PKI (Infraestructura de clave pública) para esto no tiene mucho sentido si sus usuarios son usuarios reales de su sitio web / servicio. HTTPS ya está haciendo el cifrado de la capa de transporte para usted.

Lo que debes hacer es la tokenización de datos + cifrado + compartimentación.

Una posible solución sería configurar una base de datos y un servidor dedicados que estén separados del resto del ecosistema de su aplicación y utilizar el cifrado de datos en reposo para su base de datos. Además de esto, también puede usar el cifrado de nivel de aplicación para ser más seguro. (Todo esto hecho utilizando AES).

Esta base de datos sería la única responsable de almacenar esta PII (SSN en su caso) y, por lo tanto, asociaría cada SSN con un UUID aleatorio que puede usarse en su "base de datos de la aplicación principal" en función de los datos cifrados reales. Este UUID aleatorio es esencialmente su clave externa para los datos confidenciales almacenados en la base de datos cifrada segura.

Esto le permite implementar políticas de ACL y permisos más estrictos que rigen el acceso a la base de datos cifrada. Para leer y escribir puede tener políticas de acceso separadas, con claves de acceso separadas para leer y escribir.

    
respondido por el Alex Urcioli 12.12.2016 - 22:43
fuente
1

No necesita criptografía de clave pública para esto. El estándar AES debería estar bien.

Obtenga un HSM (Yubico hace uno razonablemente barato). Esto hace el cifrado y descifrado por usted. La llave nunca abandona el dispositivo.

Debería realizar el cifrado / descifrado en el servidor de aplicaciones

    
respondido por el Neil McGuigan 12.12.2016 - 21:55
fuente
1

Si lo que está describiendo es un proyecto que involucra información privada de personas reales, recomiendo buscar soluciones de cifrado de DB profesionales / comerciales en lugar de intentar implementar el cifrado por su cuenta.

Ya sabes el dicho común de que no deberías hacer tu propio . Parafraseando un comentario, leí una vez en alguna parte: "A menos que haya escrito un doctorado sobre el tema, no está calificado para escribir su propio algoritmo de cifrado".

Pero incluso si utiliza un algoritmo probado como RSA, AES, etc., hay muchas cosas que pueden salir mal durante la implementación.

Esto es especialmente cierto cuando se trata de cifrado de base de datos.

Desea asegurarse de estar usando el algoritmo más seguro, pero también lo está implementando de una manera que no comprometa el rendimiento de su base de datos.

Debe saber que es usando el modo de cifrado de bloque adecuado o aplicando el vector inicial correctamente. Debe saber que su cifrado no sabotea sus modelos de datos, relaciones o formatos existentes. Vaya a soluciones con tecnología de cifrado de preservación de formato.

Debe asegurarse de que su implementación cuida el ciclo de vida de la clave de cifrado y aplique las auditorías adecuadas en cada una de las columnas cifradas.

Te lo digo como alguien que ha estado allí. A menos que sea solo un proyecto favorito, opte por soluciones probadas y comprobadas en ese mercado que se ajusten a sus necesidades particulares. No nos dice mucho acerca de qué DBMS está utilizando (puede que sea muy importante), pero me imagino que es un DB relacional. Dado que no tendrá que cifrar todo en la base de datos, le recomendaría utilizar el cifrado basado en columnas. De esa manera, podrá establecer políticas / claves de cifrado y control de acceso específicas para cada una de las columnas. También puede aumentar el rendimiento general posterior al cifrado.

Si está utilizando RDBMS de código abierto esta puede ser una buena solución para su caso. Para RDBMS comerciales, los proveedores generalmente tienen el cifrado basado en columnas correspondiente o puede consultar this o this o esto .

Espero que la respuesta ayude.

    
respondido por el NA AE 13.12.2016 - 02:49
fuente

Lea otras preguntas en las etiquetas