Rendimiento de generación de clave de cifrado

0

Una pregunta para expertos en criptografía. Imagina que tenemos un Notes.app conceptual:

  • Hay notas (título | contenido) almacenadas como cadenas cifradas AES-256
  • La aplicación debe presentar una lista de todas las notas (títulos) en una lista en su ventana principal
  • Cada título | contenido está encriptado con una clave, generada a partir de una contraseña y un salt
  • Imaginemos que el algoritmo de generación de claves toma ~ 80 ms en un dispositivo móvil para generar una clave

Con las siguientes condiciones, llevaría casi 1 segundo descifrar títulos de 10 notas. Pero, ¿y si hay muchas notas?

Mis 2 centavos sobre el problema: Encripta todas las notas con diferentes vectores de inicialización, pero también con sal idéntica. Eso me permitiría generar una clave de descifrado solo una vez y descifrar muchas notas rápidamente.

La pregunta: al hacerlo, terminaríamos con muchas notas diferentes, cifradas con una clave idéntica. ¿Eso compromete de alguna manera la seguridad del cifrado AES? ¿Es posible que saber que hay un montón de archivos no solo con una contraseña idéntica, sino también con una sal idéntica hace que sea posible descifrar el cifrado?

Gracias por tus pensamientos

    
pregunta Marius 09.02.2014 - 15:04
fuente

1 respuesta

2

El hashing de contraseñas se trata de convertir un < em> contraseña (que es débil, por definición) en una secuencia de bits adecuada para almacenamiento (token de verificación de contraseña) o usar como clave de cifrado (en cuyo caso estamos haciendo derivación de clave basada en contraseña ). Para tolerar el uso de contraseñas, debemos seguir algunas reglas estrictas:

  • Use hash lento con muchas iteraciones (es más fácil decirlo que hacerlo, así que no sea creativo y use un estándar bien estudiado como bcrypt o PBKDF2).
  • Nunca reutilice un valor de sal para otra instancia de contraseña . De hecho, si dos contraseñas están encriptadas con la misma sal, entonces atacar una permitirá atacar a la otra "gratis".

Sin embargo, una vez que haya convertido la contraseña en una clave, puede usarla como cualquier clave. Si su sistema de cifrado no es ridículamente frágil, no debería haber ningún problema con el uso de la misma clave para cifrar muchos archivos. En el caso de algo basado en AES, esto implica, de hecho, un nuevo IV para cada archivo. Las propiedades de ese IV dependen del mecanismo de cifrado real; AES-CBC requiere un IV aleatorio, uniforme e impredecible, mientras que algunos modos más nuevos como GCM solo necesitan una repetición IV y por lo tanto funcionan bien con un simple contador.

Tenga en cuenta que muchos esquemas de encriptación basados en contraseña utilizan un sistema de sal y iteraciones para agrupar la contraseña en una secuencia de bits que contienen ambos la clave y la IV. Tales sistemas no se pueden utilizar para más de un archivo; de lo contrario, reutilizará la IV, y eso es un pecado mortal (generalmente peor que reutilizar una sal, que ya es bastante mala). Si desea reutilizar la clave resultante del hashing de contraseña, DEBE generar un nuevo IV para cada ejecución de encriptación.

Además, tenga en cuenta que si dos archivos están cifrados con la misma clave derivada de la contraseña, es probable que sus encabezados incluyan el salt (hay que ponerlo en algún lugar, de modo que esté disponible para el descifrado), por lo que tendrá fugas. La información de que ambos archivos están protegidos con la misma contraseña y, por lo tanto, tienen la misma fuente. Dependiendo de su contexto, esto puede o no ser un problema para usted.

A otras personas les ha parecido conveniente utilizar el expediente simple de almacenar sus diez archivos en un solo archivo Zip y cifrarlos como un solo archivo. Dependiendo de su contexto, esto puede ser aplicable (o no), y es mucho más sencillo de implementar sin dañar la capa criptográfica. En general, el diseño de su propio formato de encriptación y el ensamblaje de algoritmos es un camino lleno de peligros, y no puede saber si lo hizo bien o no (la seguridad no es funcionalidad: no se puede probar). / p>     

respondido por el Tom Leek 09.02.2014 - 15:38
fuente

Lea otras preguntas en las etiquetas