¿Cuáles son las mejores prácticas (política de seguridad de la aplicación) para modificar Rijndael Salt, IV, Pass Phrase?

3

(Nota: originalmente publicado en SO: se recomienda publicar en SSE)

Con respecto al cifrado de Rijndael, ¿cuáles (si las hay) son las mejores prácticas (y las consecuencias) con respecto a la modificación periódica de uno o más de estos valores (específicamente en una aplicación web de C # .NET):

  • sal
  • Vector de inicialización (IV)
  • frase de paso

¿Es una práctica común (o de hecho es necesario) cambiar alguno de estos valores durante la vida útil de una aplicación? (Por ejemplo, si uno o más están comprometidos, o simplemente como parte de una política general).

Si es así, ¿cuál será el impacto sobre los datos existentes en una base de datos que se cifró con los valores originales (anteriores)? Al cambiar estos valores, se podría pensar que el descifrado de los datos existentes ya no "funcionará" (¿o devolverá información falsa?).

(Imagino que el alcance de esta pregunta podría incluir la forma en que se almacenan tales valores, por ejemplo, utilizando mecanismos de almacenamiento de terceros o seguros), por lo que inicialmente digamos que los valores mencionados anteriormente se almacenan actualmente en texto sin formato en una clase. nombrado RijndaelCryptography, y continuar desde allí.)

Para ilustrar mi pregunta, consulte el siguiente enlace: Cómo: Encriptar y descifrar datos usando una clave simétrica (Rijndael) (C # / VB.NET)

¿Es este ejemplo en particular una buena práctica (arreglar el pase / sal / IV a nivel de código)?

Actualización 1

  • Se eliminó "AES" de la pregunta.

Actualización 2

  • Leí que Microsoft recomienda utilizar AES en lugar de Rijndael:
  

"La clase Rijndael es la antecesora del algoritmo Aes. Debe usar el algoritmo Aes en lugar de Rijndael. Para obtener más información, consulte la entrada Las diferencias entre Rijndael y AES en el blog de seguridad de .NET". ( Enlace : vea hasta la mitad de la página)

    
pregunta 41st 08.10.2012 - 14:48
fuente

4 respuestas

4

AES solo toma una llave y una IV. El IV debe ser aleatorio y diferente para cada encriptación. Solo hay que anteponerlo al texto cifrado. También recomiendo encarecidamente agregar autenticación.

En cuanto a las frases de contraseña, las evitaría siempre que fuera posible en favor de una clave aleatoria simple. Las claves son seguras y evitan el costo de la derivación de claves. Utilice solo contraseñas cuando el usuario necesite ingresarlas.

Cuando realmente necesita una contraseña, un recuento de iteraciones suficiente, genere un salt aleatorio y use PBKDF2 (o mejor). Este hashing y salado solo existe para compensar las contraseñas débiles.
Cuándo elegir una nueva sal en clave derivada es más complicado. Lo ideal es utilizar uno nuevo aleatorio para cada cifrado, pero eso podría ser demasiado costoso. A veces puede reutilizarlos, a veces puede guardar la clave en caché, pero eso depende de la aplicación.

No codificaría la clave en tu código fuente. El archivo web.config parece un lugar más apropiado. Realmente no puede ocultar la clave, ya que su aplicación la necesita.

    
respondido por el CodesInChaos 08.10.2012 - 18:02
fuente
4

No debes implementar el criptográfico por ti mismo. Dadas tus preguntas, hay muchas cosas que podrías equivocarte. En cambio, use una biblioteca de alto nivel como GPG (para cifrar datos en reposo) o TLS (para datos en movimiento) ).

(Si implementara el suyo propio, no debería generar claves de cifrado a partir de una contraseña ; en su lugar, debe usar una clave aleatoria verdadera. Debe elegir un IV aleatorio para cada mensaje según lo requiera el modo. Y debe usar cifrado autenticado / autenticación de mensajes . Pero en realidad, no debe implementar el suyo propio, ya que hay mucho que aprender.)

    
respondido por el D.W. 08.10.2012 - 18:39
fuente
3

Las respuestas existentes son excelentes, pero ignora un aspecto importante de tu pregunta: la migración a nuevos IV, modos y claves.

La forma más sencilla de hacerlo es agregar nuevas columnas a su base de datos. Uno para una ID de clave de cifrado (un valor único para identificar la clave de cifrado utilizada), uno para el algoritmo de cifrado y otro para la IV.

Con su configuración actual, generaría un UUID que será una referencia indirecta a su frase de contraseña de cifrado actual. Esto irá en la columna de ID de clave para todos los textos cifrados existentes. El nombre del algoritmo completo, el tamaño de bit y el modo (por ejemplo, "AES-128-ECB" si es el que está utilizando) irán a la columna de algoritmo. Y tu IV estático actual va en la columna IV.

Para nuevos cifrados, cree una nueva clave a partir de un CSPRNG (generador de números pseudoaleatorios criptográficamente seguros) y un nuevo UUID que identificará esta clave. Elija un modo apropiado (CBC y CTR son buenas opciones; CBC requiere, para todos los propósitos y propósitos, números aleatorios de un CSPRNG, mientras que CTR requiere solo un único punto, que puede ser un simple contador). Para cada nuevo cifrado, genere un IV único de acuerdo con los requisitos del IV para el modo que haya elegido. Cifre los datos con la clave y la IV, y almacene la ID de la clave, el algoritmo, la IV y el texto cifrado en su base de datos.

Para descifrar, use la clave (referenciada por ID), el algoritmo, IV y el texto cifrado como se registra en la base de datos. Si la ID de la clave coincide con la clave que está utilizando actualmente, también debe volver a cifrar los datos mediante el proceso descrito anteriormente.

    
respondido por el Stephen Touset 08.10.2012 - 20:00
fuente
0

En general, creas un nuevo salt cada vez que vuelves a cifrar lo que sea que estés protegiendo con el salt (generalmente, una contraseña).

Se debe utilizar un nuevo IV cada cada vez que cifre un mensaje. Los IV duplicados no deben nunca usarse, es decir, cada mensaje cifrado debe usar un valor IV diferente.

Las frases de contraseña se cambian periódicamente, con la frecuencia que sea práctica para los usuarios. Esto puede variar desde una vez al mes hasta una vez al año. La mayoría de los lugares en los que he trabajado nos obligan a cambiar nuestras frases de contraseña de inicio de sesión cada 90 días. Cambiar las frases de contraseña a menudo conduce a hábitos de usuario descuidados (es decir, el uso de notas post-it para realizar un seguimiento de ellas), mientras que no las cambia con la frecuencia suficiente aumenta la posibilidad de una violación de seguridad.     

respondido por el David R Tribble 26.09.2012 - 23:26
fuente

Lea otras preguntas en las etiquetas