password_verify password_bcrypt password online desencriptar .net security hash passwords

password_bcrypt - ¿Hay una función incorporada para hash passwords en.NET?



password_verify (4)

He visto esta pregunta Contraseñas de texto sin formato cifrado / hashing en la base de datos

y soy consciente de que no debería hacer md5 ("sal" + contraseña); y veo una implementación en python para una solución.

¿Existe una función .NET incorporada con params que pueda usar en lugar de escribir la mía?



No creo que haya una sola función, pero puedes hacerlo en unas pocas líneas (aquí usando SHA512, pero hay otras opciones):

using (var sha = new SHA512CryptoServiceProvider()) { byte[] hashed = sha.ComputeHash(Encoding.Default.GetBytes(saltedPassword)); string output = Convert.ToBase64String(hashed); }

Asegúrese de utilizar una de las clases de Crypto ... para garantizar que se use el algoritmo más seguro.


No, no deberías usar MD5 para el hash de contraseñas.

¡¡¡¡¡Malo!!!!! ¡¡¡Tampoco debe realizar una contraseña + de sal sobre un solo pase Hash (md5 u otro) !!! ¡¡¡¡Malo!!!!

Tampoco deberías hacer sal + contraseña hashed varias veces (¡no XOR cada pase hash como por PBKDF2! ¡¡¡Malo !!

Use esta API: https://sourceforge.net/projects/pwdtknet ¡ Bien!


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 es tan bueno como PBKDF2-HMAC-SHA-512, sigue siendo razonable para el hashing de contraseñas.

Argumentos PBKDF2:

  • HMAC no es un argumento para esta clase: HMAC-SHA-1 está fijado 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.
  • Salt es una cadena criptográficamente aleatoria por fila 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 la cantidad de veces que va a hacer bucles. Para cualquier hardware de escritorio o servidor, comience en decenas de miles y suba hasta que duela.
    • el número de iteraciones también debe almacenarse en texto sin formato en la base de datos, por lo que es trivial cambiar este número más adelante (es decir, aumentarlo a medida que aumenta la potencia de procesamiento).
  • .GetBytes es la longitud de salida en, lo adivinaste, bytes. En este caso, debes usar 20.
    • Motivo (discusión avanzada): para el hash de contraseñas, este nunca debe ser mayor que el tamaño hash nativo, porque un atacante no necesitará generar más que eso (y generar el tamaño hash nativo + 1 bytes toma el doble de tiempo, ya que inicia un conjunto nuevo 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 que si falla el primer bloque , 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.

Tenga en cuenta que HMACSHA512 versus Rfc2898DeriveBytes para el hash de contraseñas contiene ejemplos de código .NET que no he analizado en detalle, pero que pueden ser un punto de partida útil.