¿Cifrar elementos con una sola clave o usar KDF + Salt para cifrar cada elemento?

5

Actualmente estoy planeando el desarrollo de un sistema donde se almacenará información extremadamente sensible para usuarios individuales. Actualmente se están discutiendo dos enfoques. Para hacerlo más concreto, digamos que estamos cifrando el número de seguridad social (SSN) de cada usuario:

  1. Una vez, genere una clave de cifrado global / iv. Cifre cada SSN en la base de datos con la misma clave de cifrado / iv.
  2. Una vez, genera un secreto global. Use el secreto global y un KDF (como PBKDF2 con un sal por usuario) para generar una clave única, un par iv para cifrar el SSN de cada usuario.

No sé lo suficiente como para abogar, ¿existe alguna ventaja sobre (2) sobre (1)?

EDITAR: Estoy buscando principalmente ayuda para sopesar los pros y los contras generales de cada enfoque. Es decir, ¿proporciona (2) alguna seguridad adicional sobre (1) dado que ambos dependen de un secreto global compartido?

    
pregunta Eric Scrivner 19.04.2016 - 21:46
fuente

3 respuestas

4

Reutilizar un IV es una mala idea. Cada modo de encriptación tiene sus propios requisitos para la administración de IV, pero para la mayoría de ellos, las consecuencias de la reutilización de IV varían desde problemáticas hasta mortales. No hagas eso.

El método "normal" es usar una sola clave y un IV por registro: cada elemento cifrado obtendrá su propio IV, que se almacenará a lo largo del resultado del cifrado. Generar tanto la clave como la IV a partir de un secreto global y una "sal" por registro generalmente funciona (da como resultado una IV pseudoaleatoria, que está bien para la mayoría de los modos de encriptación), pero agrega complejidad, que es, en sí misma, algo malo. p>

Hacer el cifrado correctamente es un arte difícil, especialmente porque en la mayoría de los contextos que requieren cifrado, también se debe verificar la integridad. Su mejor apuesta sería un modo de encriptación autenticada , básicamente, GCM . GCM toma como entradas:

  • Se recomienda un IV de tamaño nominalmente arbitrario, pero se recomienda un IV de 12 bytes.
  • Una clave adecuada para AES (128, 192 o 256 bits)
  • El mensaje m para cifrar.

La salida consiste entonces en c , el cifrado de m (con el mismo tamaño exacto), y t , la "etiqueta de autenticación ", que tiene el mismo tamaño que un bloque AES (128 bits, es decir, 16 bytes). Lo que luego debes almacenar es el IV, la salida encriptada c y t .

Al descifrar, el motor de descifrado usará el IV y c , y producirá t nuevamente, que luego tendrá que comparar con el t para ver si hay alteraciones.

Lo bueno de GCM es que el único requisito para la IV es no reutilizar . No es necesario que la IV sea aleatoria o impredecible, pero NO DEBE volver a utilizar la misma IV dos veces. Puede usar una marca de tiempo o un contador o un índice de fila de la base de datos, siempre que se asegure de no volver a utilizar un valor IV.

    
respondido por el Thomas Pornin 20.04.2016 - 00:02
fuente
4

Dada la propiedad de los SSNs, aunque se garantiza que todo será diferente, no se agrega mucho en términos de seguridad utilizando el segundo enfoque, si se utiliza modo de operación (que no reveló) permite la reutilización IV.

Pero permítame sugerir una tercera opción: debería usar un Módulo de seguridad de hardware (HSM) para esto.

Su pregunta me deja con la impresión de que está intentando resolver esto mediante programación, pero hay un gran problema con eso:

Si su aplicación es para usar los SSN, tiene que haber una clave accesible en algún lugar. La codificación del SSN probablemente debería implementarse para mantener la seguridad de los datos en caso de que uno de los discos duros o los datos almacenados se filtren.

Cuando esto sucede y usted mantiene su clave con los datos, ya no hay nada que proteja los datos. Un volcado de datos seguramente también contendrá la clave, a menos que se use un HSM.

    
respondido por el Tobi Nary 19.04.2016 - 23:55
fuente
0

Una cosa que debe considerar es si este valor se usa en cláusulas JOIN o GROUP BY en las aplicaciones que usan estos datos. Por ejemplo, si sus aplicaciones necesitan ensamblar un historial de crédito basado en el SSN, desearía que ese valor se haya cifrado de manera determinista en todas sus tablas de base de datos. La alternativa sería descifrar todos los registros y luego usar el valor descifrado como el criterio ÚNICO, lo que sería terriblemente ineficiente.

    
respondido por el Dave Mulligan 26.04.2016 - 07:35
fuente

Lea otras preguntas en las etiquetas