2008-10-10 14 views
5

Estoy tratando de generar hashes MD5 equivalentes tanto en JavaScript como en .Net. Al no haberlo hecho tampoco, decidí utilizar contra un cálculo de terceros: web site para la palabra "contraseña". Voy a añadir en sales más tarde, pero por el momento, no puedo obtener la versión .NET para que coincida con el hash del sitio web:¿Por qué mi hash MD5 calculado en .net no es equivalente al hash calculado en un sitio web?

5f4dcc3b5aa765d61d8327deb882cf99 

que supongo que es un problema de codificación, pero me he probado aproximadamente 8 variaciones diferentes de métodos para calcular un hash MD5 en .Net, y ninguno de ellos coincide con lo que he obtenido en JavaScript (o desde el sitio web). Este MSDN example es uno de los métodos que he tratado, lo que resulta en este hash que he recibido comúnmente:

7c6a180b36896a0a8c02787eeafb0e4c 

Edición: Lamentablemente, accidentalmente he estado proporcionando diferentes cadenas de origen para las dos implementaciones diferentes. EBSAK. : -/Todavía estará interesado en escuchar su respuesta al seguimiento.

Pregunta de bonificación: ¿qué codificación/formato sería mejor para almacenar valores hash en una base de datos?

+0

¿Qué estás usando el hash Javascript para? La razón por la que pregunto es que, si se trata de seguridad, solo se debe generar en el servidor. –

+0

Para dar un paso atrás en esta discusión un poco, creo que [la publicación de Thomas Ptacek] (http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you -necesitar-saber-sobre-seguro-contraseña-esquemas.html) (en respuesta a una [publicación de Jeff Atwood] (http://blog.codinghorror.com/rainbow-hash-cracking/) sobre un tema similar) explica mejor por qué no debe usar algo como MD5 para el hash de contraseñas. Lectura recomendada. –

Respuesta

9

ejecutar el código desde el sitio de MSDN se citan:

// Hash an input string and return the hash as 
    // a 32 character hexadecimal string. 
    static string getMd5Hash(string input) 
    { 
      // Create a new instance of the MD5CryptoServiceProvider object. 
      MD5 md5Hasher = MD5.Create(); 

      // Convert the input string to a byte array and compute the hash. 
      byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); 

      // Create a new Stringbuilder to collect the bytes 
      // and create a string. 
      StringBuilder sBuilder = new StringBuilder(); 

      // Loop through each byte of the hashed data 
      // and format each one as a hexadecimal string. 
      for (int i = 0; i < data.Length; i++) 
      { 
       sBuilder.Append(data[i].ToString("x2")); 
      } 

      // Return the hexadecimal string. 
      return sBuilder.ToString(); 
     } 


     static void Main(string[] args) 
     { 
      System.Console.WriteLine(getMd5Hash("password")); 
     } 

devuelve:

5f4dcc3b5aa765d61d8327deb882cf99 
+0

Es cierto. : -/Estaba usando diferentes cadenas fuente en las dos implementaciones. ¡Idiota! – pc1oad1etter

0

consigo el mismo valor que el sitio web de la palabra "contraseña":

$ echo -n password | md5 
5f4dcc3b5aa765d61d8327deb882cf99 

Sin ver el código que está utilizando realmente, es difícil saber lo que podría estar pasando mal.

En cuanto al almacenamiento de hashes en una base de datos, los almaceno como una cadena hexadecimal. Aunque la mayoría de las bases de datos pueden manejar blobs binarios, almacenarlos como binarios solo ahorra la mitad del espacio y son más difíciles de consultar y manipular. Es probable que otros datos de que esté almacenando junto con el hash sea más grande de todos modos.

+0

O use Base64, que solo expande el binario en un tercio en lugar de duplicarlo. No es que MD5 sea seguro de usar para hash de contraseñas. –

0

Esta versión VB.Net da los mismos resultados que MySQL desde mi propia experiencia:

Private Function MD5Hash(ByVal str As String) As String 

    Dim md5 As MD5 = MD5CryptoServiceProvider.Create 
    Dim hashed As Byte() = md5.ComputeHash(Encoding.Default.GetBytes(str)) 
    Dim sb As New StringBuilder 

    For i As Integer = 0 To hashed.Length - 1 
     sb.AppendFormat("{0:x2}", hashed(i)) 
    Next 

    Return sb.ToString 

End Function 
0

¿Tiene cualquier código de cómo se está tratando de hacer esto?

(respuesta a la segunda Q) Normalmente utilizo un campo de cadena y lo almaceno como codificación BASE64. Lo suficientemente fácil para trabajar y hacer comparaciones.

/// <summary> 
/// Gets the Base 64 encoded SHA1 hashed password 
/// </summary> 
/// <returns>A Base 64 encoded string representing the SHA1 Hash of the password</returns> 
public string ToBase64SHA1String() 
{ 
    return Convert.ToBase64String(this.GetSHA1HashCode()); 

} 
+0

Me había vinculado a uno de los métodos que estaba usando - en la publicación. – pc1oad1etter

0

También hay que señalar que las sumas MD5 puede ser violada con tablas de arco iris (hay programas gratuitos en Internet que aceptarán una suma MD5 como entrada y generarán un texto claro, que normalmente es una contraseña)

SHA1 es probablemente una mejor opción ...

EDIT: la adición de sal es una buena manera de evitar ser su huella digital a partir invirtiéndose
EDIT 2: si hubiera tomado la molestia de leer tu post me he dado cuenta de que ya ha mencionado que va a agregar sal

+0

Yo diría que incluso con una sal MD5 no es lo suficientemente segura. –

+0

@Ramhound bien ahora 5 años después de su comentario, definitivamente no es seguro =) – Gaspa79

3

Esto está ocurriendo porque de alguna manera está hashing password1 en lugar de password, o tal vez el cálculo de la password incorrectamente y que de alguna manera es igual misteriosamente password1.

Usted puede hacer una búsqueda inversa del hash MD5 que ya ha proporcionado por google

7c6a180b36896a0a8c02787eeafb0e4c 
Cuestiones relacionadas