Pasando el cifrado con IV como una única matriz

1

Soy bastante nuevo en esto, así que estoy seguro de que se me ha preguntado y respondido, pero no puedo encontrar una respuesta clara. Si esto ya se ha solucionado, indíqueme la dirección correcta y eliminaré esta pregunta.

Tengo un programa que deberá aceptar un nombre de usuario y contraseña del usuario. Este nombre de usuario y contraseña son para otro servidor, pero la información deberá transmitirse a unas pocas DLL antes de enviar la solicitud final al otro servidor. Mi preocupación es pasar nombres de usuario y contraseñas entre archivos DLL sin cifrado, por lo que he creado un sencillo conjunto de métodos de cifrado y descifrado utilizando la clase System.Security.Cryptography.CryptoStream de Microsoft.

Esencialmente, se realizan las siguientes operaciones.

Se ingresa una cadena simple en el método de cifrado junto con la clave de cifrado. Este método genera un IV aleatorio (8 bytes), una matriz aleatoria (8 bytes) y el cifrado de la matriz de bytes. La IV, la matriz aleatoria y el cifrado se colocan en una matriz de un solo byte y se transfieren entre DLLS.

La matriz de bytes es recibida por una DLL y se pasa a través del método de descifrado con la clave de cifrado. Este método toma la parte IV de la matriz y la parte de encriptación de la matriz, e ignora los 8 bytes aleatorios agregados (estos se agregan simplemente por razones totalmente arbitrarias). La cadena se descifra.

¿He roto accidentalmente toda la seguridad de usar un cifrado al agregar los IV a la matriz de bytes cifrada?

¿Debo usar los 8 bytes aleatorios como sal (solo, ya que los tengo de todos modos) y pasarlos con el cifrado? ¿O eso lo rompería aún más?

Tenga en cuenta que no tengo acceso directo a una lista de nombres de usuario o contraseñas, esta es una aplicación completamente externa. Solo quiero asegurarme de que la solicitud y el movimiento de los pares de nombre de usuario y contraseña estén seguros en mi final.

    
pregunta Mikey Awbrey 19.04.2017 - 18:50
fuente

1 respuesta

0

Los IV no son secretos y es común pasarlos junto con el texto cifrado. Esa parte no es un problema. Ya que no dijo contra qué amenaza está defendiéndose, asumiré que le preocupa leer la contraseña directamente desde la memoria o desde volcados de memoria. En ese caso, es posible que tenga un problema diferente con su enfoque: cadenas.

Las cadenas en .NET son inmutable y no puedes borrarlo una vez que hayas terminado con eso. Si asigna una cadena vacía a una variable, el valor antiguo permanecerá en la memoria y obtendrá un nuevo objeto de cadena vacía en su lugar. Incluso si crea una matriz de bytes y la cifra como propuso, la cadena sobrante permanecerá en la memoria y esperará hasta que el recolector de basura la borre.

Si no controla la forma en que se reciben las contraseñas, esto podría ser imposible de resolver. Debe asegurarse de que la contraseña nunca se almacene en una cadena. Supongamos que puedes resolver esta parte. Tus opciones entonces serían:

  1. Siempre puede usar matrices de bytes y realizar el cifrado como describió ( no se requiere salt , solo asegúrese de que nunca reutilizar key / IV pair y genera IVs aleatorios con CSPRNG fuerte) o
  2. Use SecureString .

SecureString es diseñado para resolver exactamente el problema que describe sin la necesidad de "rodar el tuyo".

La introducción de primitivas de criptografía en una solución y creer que hará que la solución sea más segura es engañosa. A veces, el alcance del problema es mucho mayor de lo que cree.

    
respondido por el Marko Vodopija 20.04.2017 - 10:38
fuente

Lea otras preguntas en las etiquetas