para ocultar instalar guardar fotos descargar contraseña como calculadora apple app aplicaciones aplicacion c# cryptography rfc2898

c# - ocultar - descargar app store para pc



¿Por qué necesito usar la clase Rfc2898DeriveBytes(en.NET) en lugar de usar directamente la contraseña como clave o IV? (1)

Realmente, realmente no desea utilizar una contraseña de usuario directamente como clave de cifrado, especialmente con AES.

Rfc2898DeriveBytes es una implementación de PBKDF2. Lo que hace es repetidamente hash la contraseña del usuario junto con el salt. Esto tiene múltiples beneficios:

En primer lugar, puede usar contraseñas de tamaño arbitrario: AES solo admite tamaños de clave específicos.

En segundo lugar, la adición de la sal significa que puede usar la misma frase de contraseña para generar múltiples claves diferentes (asumiendo que la sal no es una constante, como lo es en su ejemplo). Esto es importante para la separación de claves; Reutilizar claves en diferentes contextos es una de las formas más comunes en que se rompen los sistemas criptográficos.

Las iteraciones múltiples (1000 de forma predeterminada) ralentizan los ataques de adivinación de contraseñas. Considere a alguien que está tratando de adivinar su clave AES. Si acaba de usar la contraseña, esto sería sencillo: solo intente con cada contraseña posible como clave. Por otro lado, con PBKDF2, el atacante primero tiene que realizar 1000 iteraciones de hash para cada conjetura de contraseña. Entonces, aunque ralentiza al usuario solo un poco, tiene un efecto desproporcionado en un atacante. (De hecho, es bastante común utilizar recuentos de iteraciones mucho más altos; se recomienda 10000).

También significa que la clave de salida final se distribuye uniformemente. Si usó la contraseña, por ejemplo, normalmente 16 de los 128 bits de la clave serían 0 (el bit ASCII alto). Eso de inmediato hace que la búsqueda de claves sea más fácil de lo que debería ser, incluso ignorando las contraseñas.

Finalmente, AES tiene vulnerabilidades específicas con ataques clave relacionados. Los ataques de claves relacionadas son posibles cuando un atacante conoce algunos datos encriptados con varias claves, y existe alguna relación conocida (o adivinada) entre ellos. Por ejemplo, si cifró los datos con una clave de contraseña de "Mi clave AES apesta" (16 bytes, para AES-128) y con "MI SUCHA CLAVE AES", podría ser posible un ataque clave relacionado. Los ataques más conocidos actualmente en realidad no permiten romper el AES completo de esta manera, pero han ido mejorando progresivamente con el tiempo; la semana pasada se publicó un nuevo ataque que rompe 13 rondas (de un total de 14) de AES-256 usando un ataque clave relacionado. Sería profundamente imprudente confiar en que dichos ataques no mejoren con el tiempo.

¿Cuál es la diferencia entre usar Rfc2898DeriveBytes y solo usar Encoding.ASCII.GetBytes(string object); ?

He tenido un éxito relativo con cualquiera de los dos enfoques, el primero es un enfoque más largo y sinuoso, ya que el último es simple y al grano. Ambos parecen permitirte hacer lo mismo eventualmente, pero estoy luchando para ver el punto en el uso del primero sobre el segundo.

El concepto básico que he podido comprender es que puede convertir las contraseñas de cadena en matrices de bytes para usar, por ejemplo, una clase de cifrado simétrico, AesManaged . A través de la clase RFC, pero puedes usar los valores de sal y la contraseña al crear tu objeto rfc. Asumo que es más seguro, pero aún así es una suposición sin educación en el mejor de los casos. También que te permite devolver arrays de bytes de cierto tamaño, bueno, algo así.

Aquí hay algunos ejemplos para mostrarte de dónde vengo:

byte[] myPassinBytes = Encoding.ASCII.GetBytes("some password");

o

string password = "P@%5w0r]>"; byte[] saltArray = Encoding.ASCII.GetBytes("this is my salt"); Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(password, saltArray);

El objeto ''rfcKey'' ahora se puede usar para configurar las propiedades .Key o .IV en una clase de algoritmo de cifrado simétrico.

es decir.

RijndaelManaged rj = new RijndaelManaged (); rj.Key = rfcKey.Getbytes(rj.KeySize / 8); rj.IV = rfcKey.Getbytes(rj.Blocksize / 8);

¡''rj'' debería estar listo para irse!

La parte confusa ... así que, en lugar de usar el objeto ''rfcKey'', ¿no puedo simplemente usar mi matriz ''myPassInBytes'' para ayudar a configurar mi objeto ''rj''?

He intentado hacer esto en VS2008 y la respuesta inmediata es NO. Pero, ¿han recibido una respuesta más informada sobre por qué la clase RFC se usa sobre la otra alternativa que mencioné anteriormente?