2012-02-10 16 views
7

He siguiente código en C#C# PasswordDeriveBytes Confusión

PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations); 
byte[] KeyBytes = DerivedPassword.GetBytes(32); 

estoy usando "SHA1" algoritmo de hash.

Según la definición de SHA1, genera la clave de 160 bits (20 bytes). Mi pregunta es cómo el método GetBytes obtiene 32 bytes de DerivedPassword, ¿qué algoritmo se usa detrás del método GetBytes?

Respuesta

11

implementación de PKCS # 5 originales (también conocido como PBKDF1) de Microsoft incluyen inseguros extensiones para proporcionar más bytes que la función hash puede proporcionar (ver informes de errores y herehere).

Incluso si no se Buggy debe evitar indocumentados, extensiones propietarias a las normas (o puede que nunca sea capaz de descifrar los datos en el futuro. - al menos no fuera de Windows)

I fuertemente sugieren puede utilizar el más nuevo Rfc2898DeriveBytes que implementa PBKDF2 (PKCS # 5 v2) que está disponible desde .NET 2.0.

4

¿Qué algoritmo usa el método GetBytes?

Utiliza el algoritmo PBKDF1, que se modifica ligeramente para permitir una longitud de clave arbitraria. Una clase de reemplazo, Rfc2898DeriveBytes usa PBKDF2.

Puede leer el Wikipedia Article on PBKDF2 para obtener una idea general de los conceptos subyacentes que hacen que esto funcione.

+0

Cómo este método derivó 32 bytes de 20 bytes (que se generó el algoritmo hash 'SHA1'). – Siddiqui

+0

@Siddiqui @ 'HenrickHellstrom lo explicó muy bien. – vcsjones

4

La función de derivación de teclas utiliza una función llamada Key Stretching. (No se moleste en buscarlo en Wikipedia, porque el artículo actual confunde el concepto con Key Strengthening, que es algo completamente diferente.)

El estiramiento de teclas se realiza comúnmente aplicando un PRF (como una función hash o cifrado) en cualquier modo CTR, o al iterarlo y concatenar las salidas intermedias.

Por ejemplo, si utiliza el procedimiento CTR, SHA-1 como PRF, y desea 32 bytes de salida pseudoaleatoria, concatenará SHA1 (material clave, 0) con los primeros 12 bytes de SHA1 (material clave, 1).

+0

gracias por su reproducción, ¿puede darme más explicaciones sobre el procedimiento de CTR? – Siddiqui

+1

En este caso, los números 0 y 1 podrían estar representados por un solo bit (recuerde que SHA-1 opera en cadenas de bits como entrada), pero generalmente (material clave, 0) etc. se define como p. (a) material de claves con un solo byte (o palabra) 0 agregado al final, o (b) un bloque de entrada de 64 bytes completo con material de teclado primero, algo de relleno (generalmente bytes con valor cero) y un byte único con valor 0 en el fin. –