¿Cifrando archivos en .NET?

0

Estoy en una situación en la que me gustaría cifrar archivos de audio y texto para una aplicación en la que estoy trabajando. Hice algunas miradas a mi alrededor y, por lo que he visto, el algoritmo de encriptación Rijndal funcionaría bien para esto. Encontré una implementación que usa RijndaelManaged de .NET clase here .

En mi sitio, aceptaré archivos de audio de los clientes y generaré archivos de texto a partir de ellos. Me gustaría cifrar ambos archivos mientras están en mis servidores, de esta manera, si un usuario malintencionado puede acceder al sistema de archivos, no podrá acceder al contenido de los archivos.

Por lo que entiendo, es muy fácil arruinar el cifrado, por lo que esperaba obtener algunas opiniones sobre si ejemplo de cifrado al que me he vinculado ¿es una forma efectiva de cifrar archivos? ¿Hay alguna debilidad potencial en este ejemplo? Si es así, ¿sugerencias sobre cómo hacer que este ejemplo sea más seguro?

    
pregunta Abe Miessler 21.04.2014 - 18:05
fuente

2 respuestas

2

El cifrado no es su problema, ya que la mayoría de los ejemplos de cifrado C # harán lo correcto con la clase CryptoStream . Pero después de echar un vistazo rápido a el artículo de CodeProject que vinculó , puedo diga con certeza que es mejor que no use el código tal como se presenta. Enumeraré los problemas en el orden en que aparecen en el código.

  1. private void EncryptFile(string inputFile, string outputFile)
    El método de encriptación toma un nombre de ruta . Eso significa que los archivos estarán en su sistema de archivos en una forma vulnerable sin cifrar hasta que se encripte con este método y se elimine. Debe estar cifrado en la memoria del servidor, ya que se está conectando a través de la conexión antes de tocar cualquier dispositivo de almacenamiento.
  2. string password = @"myKey123"; // Your Key Here
    UnicodeEncoding UE = new UnicodeEncoding();
    byte[] key = UE.GetBytes(password);
    ¿Que demonios? ¡La contraseña nunca debe usarse directamente desde la cadena en bruto! ¡Debe estar marcado con algo seguro!
  3. CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);
    ¿Por qué el vector de inicialización es el mismo que la clave? Hay un método para eso: RijndaelManaged.GenerateIV();
  4. catch { MessageBox.Show("Encryption failed!", "Error"); }
    Si está ejecutando eso en un servidor sin una interfaz de usuario, eso va a causar problemas. ¡Pero el mayor problema es que este bloque de captura no es lo suficientemente específico para determinar cómo manejar el problema! Consulte Mejores prácticas para la administración de excepciones en Java o C # .

Aparte de eso, la otra debilidad potencial es cómo genera sus claves, dónde las guarda y cómo se controla el acceso a las claves.

En su caso, ¿quién guarda las claves del texto cifrado: usted o el cliente o ambos? Si también tiene las claves, tendrá que averiguar cómo un atacante que ha irrumpido en su servidor y obtuvo su texto cifrado no tendrá también sus claves.

Su mejor apuesta es almacenar los datos cifrados en el servidor con la clave cifrada. La clave en sí debe cifrarse con las credenciales del usuario. De esa manera, el servidor solo puede descifrar los datos y enviarlos al usuario cuando el usuario inicia sesión y descifra la clave con la contraseña y el servidor puede cifrar y descifrar los datos con la clave descifrada hasta que el usuario finalice la sesión, momento en el que la clave debe ser borrada de la memoria. Si implementó este sistema y sus datos fueron robados, el atacante tendría un conjunto de claves cifradas (que son inútiles hasta que se descifran con la contraseña del cliente) y blobs de datos cifrados (que también son inútiles sin las claves de descifrado).

    
respondido por el Kevin Li 22.04.2014 - 08:54
fuente
0

Personalmente, tengo más confianza en los artículos de MSDN sobre cualquier otra cosa. Dicho esto, comenzaría con Servicios de cifrado , luego Tutorial: Creación de una aplicación criptográfica , que explica el proceso de manera detallada bien.

    
respondido por el Steven Volckaert 22.04.2014 - 07:56
fuente

Lea otras preguntas en las etiquetas