2011-06-28 10 views
10

Tengo un método utilizado para generar un hash:de ajuste de un hash creado en C# con SQL

public static string GetMD5Hash(string input) 
    { 
     System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
     byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 

     bs = x.ComputeHash(bs); 

     System.Text.StringBuilder s = new System.Text.StringBuilder(); 

     foreach (byte b in bs) 
     { 
      s.Append(b.ToString("x2").ToLower()); 
     } 
     return s.ToString(); 
    } 

luego guardar ese resumen en un (255) la columna varchar. Sabiendo cuál era la cadena de entrada original, ¿sería posible llegar al mismo valor hash almacenado en la columna varchar (255), usando sql (2005)?

He intentado como loco usando diferentes tipos de datos, conversiones y la función hashbytes(), pero no he podido acercarme.

Ejemplo de mi intento fallido :(

select convert(varchar, hashbytes('MD5', convert(varbinary(200), '<censored>',0))) 
+0

No utilice MD5; es inseguro – SLaks

+1

¿por qué 'varchar (255)'? 'MD5CryptoServiceProvider' devuelve una matriz de 16 bytes de' ComputeHash() 'por lo que debe usar char (32) (si lo guarda como hexadecimal) – BrokenGlass

+0

tal vez es debido a ToLower()? – Greenisha

Respuesta

5

de #C con "bleepbloop": 04d3f95947702213e23730a0e8fac6c3

Entonces

select convert(varchar(32), hashbytes('MD5', 'bleepbloop'), 2) 

>> 04D3F95947702213E23730A0E8FAC6C3 

O usted podría almacenar & comparar como binario.

+0

Esto funcionó ... gracias un hombre tonto :) – Craigt

3

El problema aquí es que x2 es conseguir el hexágono codificación de los datos, en donde, como convert está recibiendo de su servidor configurado decodificación de los bytes (que en realidad no es válida, ya que los datos no está basado en texto). Las cosas muy diferentes. Si se mantiene como varbinary y comparar a un byte[] que debe estar bien.

Si está utilizando SQL Serv er 2008, también se puede utilizar:

select convert(varchar(32), hashbytes('MD5', convert(varbinary(200), 
      '<censored>',0)), 2) 

para obtener la versión codificada hexagonal (se puede utilizar en lugar de 12 para obtener un líder 0x)

+0

Gracias por la respuesta y la información adicional. – Craigt

Cuestiones relacionadas