2010-01-23 29 views

Respuesta

2

Salida FormsAuthentication.HashPasswordForStoringInConfigFile

string hashMD5 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "MD5"); 

string hashSHA1 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "SHA1"); 
+0

Esta API ahora está obsoleta. –

2

No creo que haya una sola función, pero se puede hacerlo en unas pocas líneas (en este caso utilizando 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 que utiliza uno de los Crypto. .. clases para asegurar que se use el algoritmo más seguro.

+4

Muy mal plan. Un hash sin sal está sujeto a un ataque de mesa arcoiris. Su uso de las clases de cifrado fue bueno, pero debe incluir una sal para que esta respuesta sea útil. Además, la última línea debería usar 'Convert.ToBase64String', que es tan rápido como' BitConverter.ToString' y produce una cadena mucho más corta (88 bytes frente a 192 bytes en este caso). Si se corrigen estos dos problemas, esta podría ser la mejor respuesta, en mi humilde opinión. –

+0

Gracias por la aclaración. Sí, obviamente la contraseña debe ser salada antes de hashing, que tenía la intención aquí, pero veo de dónde viene la confusión. Voy a actualizar para ser más explícito. Gracias por mencionar la conversión de Base64String también. –

+0

No utilice una sola pasada de ninguna función de hash, independientemente de cuán agradable sea la función. Utilice una metodología que se sabe que es buena para el hash de contraseñas: SCrypt, BCrypt o PBKDF2 (como RFC2898DeriveBytes de .NET). Mientras SHA-512 es una buena función de hash criptográfica, incluso en grave desventaja debido a que las operaciones de 64 bits son deficientes en las GPU antiguas de 2014, [oclHashcat] (http://hashcat.net/oclhashcat/) en una sola PC con 8x El reloj AMD R9 290Xstock core aún puede intentar 797 millones de intentos por segundo, o 2E15 conjeturas por mes. –

1

n no se debe utilizar MD5 para hash de la clave !!!!!

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

Tampoco debe hacer sal + hash de la contraseña varias veces (XOR unles cada pasada de hash según PBKDF2 !!! Malo !!!!

utilizar esta API: https://sourceforge.net/projects/pwdtknet buena !!!!!

1

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.

+0

¿Algún comentario sobre cómo es mejor/peor que 'FormsAuthentication.HashPasswordForStoringInConfigFile'? –

+1

RFC2898 es mucho mejor, incluso con un recuento de iteración morónico de 1 - y decenas de miles de veces mejor con un recuento de iteración razonable de decenas de miles. Comienzan con los propios de Microsoft [Nota: esta API ahora está obsoleta.] (Http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile (v = vs.110) .aspx) y continuar hasta "¡Es (casi seguro) MD5 sin sal o SHA-1! ¡No hagas eso!" basado en [Sustituir el reemplazo de FormsAuthentication.HashPasswordForStoringInConfigFile?] (https://stackoverflow.com/q/13527277/1967612) –

Cuestiones relacionadas