Sí, .NET Framework 2.0 y posteriores (hasta e incluyendo 4.5 a partir de ahora) implementa PBKDF2 (también conocido como RFC2898 y PKCS # 5v2) en una clase llamada Rfc2898DeriveBytes. Técnicamente, implementa PBKDF2-HMAC-SHA-1, que aunque no tan bueno como PBKDF2-HMAC-SHA-512, sigue siendo razonable para el uso de contraseñas.
PBKDF2 argumentos:
- HMAC no es un argumento para esta clase - HMAC-SHA-1 está arreglado en esta implementación, por lo que no tiene que preocuparse por ello.
- La contraseña es la contraseña del usuario.
- el texto claro, por supuesto, se descarta después de hash.
- Sal es una cadena por fila criptográficamente aleatoria de longitud suficiente (por ejemplo, al menos 8 bytes). Cada contraseña necesita su propia sal aleatoria, por lo que si 300 usuarios eligen "P @ $$ w0rd" como su contraseña, los resultados hash son todos diferentes.
- la sal se almacena en texto plano en la base de datos; lo necesita la próxima vez que genere el hash de contraseña para ver si el resultado es el mismo.
- Iteraciones es el número de veces que va a realizar un ciclo. Para cualquier hardware de escritorio o servidor, comience en decenas de miles y suba hasta que duela.
- el número de iteraciones también se debe almacenar en texto sin formato en la base de datos, por lo que es trivial cambiar este número más tarde (es decir, aumentarlo a medida que aumenta la potencia de procesamiento).
- .GetBytes es la longitud de salida en, lo adivinó, bytes. En este caso, debes usar 20.
- Motivo (discusión avanzada): para el hashing de contraseñas, este nunca debe ser mayor que el hash nativo, porque un atacante no necesitará generar más que eso (y generar hash nativo de tamaño + 1 bytes requiere el doble de tiempo, ya que comienza un nuevo conjunto de iteraciones para cada tamaño de hash nativo en la longitud de salida, concatenando los resultados en conjunto: el atacante puede asumir con seguridad que si el primer resultado coincide, todo coincidirá, y es 100% seguro de que si el primer bloque falla, no es una coincidencia). Como esta clase está limitada a SHA-1, el tamaño de hash nativo es de 20 bytes. Si usa otra biblioteca que tiene la opción, SHA-256 tiene 32 bytes, SHA-512 tiene 64 bytes.
Nota que HMACSHA512 versus Rfc2898DeriveBytes for password hash contiene algún código .NET muestra que no he analizado en detalle, pero que puede ser un punto de partida útil.
Esta API ahora está obsoleta. –