.net cryptography rfc2898 pbkdf2

.net - PasswordDeriveBytes vs Rfc2898DeriveBytes, obsoletos pero mucho más rápidos



cryptography pbkdf2 (3)

Estoy trabajando en una funcionalidad de cifrado basada en clases heredadas de SymmetricAlgorithm como TripleDes, DES, etc.

Básicamente, hay dos opciones para generar una clave consistente y una IV para mi clase de algoritmo, PasswordDeriveBytes y Rfc2898DeriveBytes , ambas heredadas de la clase abstracta DeriveBytes.

El método PasswordDeriveBytes.GetBytes() está marcado como obsoleto en el marco .NET, mientras que se recomienda Rfc2898DeriveBytes.GetBytes (), ya que coincide con el estándar PBKDF2. Sin embargo, según mis pruebas, llamar al mismo método GetBytes() en la clase Rfc2898DeriveBytes es casi 15 veces más lento que en la clase PasswordDeriveBytes , lo que lleva a un uso inesperado de la CPU (siempre superior al 50%).

Aquí hay algunos datos de prueba:

  • Iteraciones: 100
  • Tipo de algoritmo: DES
  • Texto original: "Soy una clave de prueba, ciframe por favor"
  • Hora:
    • PasswordDeriveBytes: 99ms
    • Rfc2898DeriveBytes: 1,373ms

Sobre la base de las pruebas, el mal rendimiento de Rfc2898DeriveBytes no es aceptable en el entorno de producción.

¿Alguien ha notado este problema antes? ¿Alguna solución puedo usar una estándar sin golpear el rendimiento? ¿Existe algún riesgo de usar un método obsoleto (podría eliminarse en una versión futura)?

¡Gracias chicos!

Editar:

Probablemente encontré dónde está el problema ... El número de iteración predeterminado para PasswordDeriveBytes es 100, mientras que para Rfc2898DeriveBytes es 1000. Después de cambiarlos al mismo número que 1000, ejecutar Rfc2898DeriveBytes es solo el doble de tiempo.


Creo que te estás perdiendo el punto de derivebytes. Se supone que es lento. Utiliza intencionalmente un algoritmo lento que no puede acelerarse mediante un truco inteligente. El parámetro típico de "número de iteraciones" debe estar en el rango 2 ^ 16-2 ^ 20 e introducir una demora de 0.1-0.5 segundos entre la contraseña que ingresa el usuario y se genera la clave. La intención es defenderse contra contraseñas débiles seleccionadas por "usuarios ignorantes perezosos" y ralentizar la búsqueda de fuerza bruta.



No son lo mismo.

Rfc2898DeriveBytes es una implementación de PBKDF2. PasswordDeriveBytes es una implementación de PBKDF1. PBKDF2 genera una salida diferente, utilizando un método diferente y un número mucho mayor de rondas que PBKDF1.

Las funciones de hashing de contraseñas, como estas, que se usan para la derivación de claves se suponen lentas. Ese es el punto: los hace mucho más difíciles de descifrar.

Las dos funciones no son compatibles y PasswordDeriveBytes no es tan seguro.