2009-05-04 24 views
7

tengo un algoritmo de hash en C#, en pocas palabras, es:algoritmo MD5 php que da mismo resultado que C#

string input = "asd"; 

System.Security.Cryptography.MD5 alg = System.Security.Cryptography.MD5.Create(); 
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 


byte[] hash = alg.ComputeHash(enc.GetBytes(input)); 
string output = Convert.ToBase64String(hash); 

// outputs: eBVpbsvxyW5olLd5RW0zDg== 
Console.WriteLine(output); 

ahora tengo que replicar este comportamiento en php,

$input = "asd"; 
$output = HashSomething($input); 
echo $output; 

¿Cómo puedo lograrlo?

I comprobado

  • md5
  • utf8_decode
  • utf8_encode
  • base64_encode
  • base64_decode
  • url_decode

pero i tomó nota de la php md5 no obtiene el == al final ... ¿qué me estoy perdiendo?

NOTA: No se puede cambiar el comportamiento de C# porque ya está implementado y contraseñas guardadas en mi db con este algoritmo.

Respuesta

18

La cuestión es md5() función de PHP por defecto devuelve la variación hexagonal del hash donde C# devuelve el byte de salida en bruto que luego debe ser hecha de texto segura con codificación base64. Si está ejecutando PHP5, puede usar base64_encode(md5('asd', true)). Observe que el segundo parámetro para md5() es verdadero, lo que hace que md5() devuelva los bytes sin formato en lugar del hex.

+4

El indicador verdadero para md5 solo existe en PHP5 o superior. En versiones anteriores necesitaría llamar a la función de paquete. – jmucchiello

5

¿Recordó que base64 codifica el hash md5 en php?

$result = base64_encode(md5($password, true));

El segundo parámetro hace MD5 devuelve una salida en bruto, lo que es lo mismo que las funciones que se está usando en C#

+0

Darn. Usted me apuesta ... El == es generalmente de la codificación Base64, lo que está haciendo con Convert.ToBase64String() es eso lo que se está perdiendo? –

+0

Wow. Fallé totalmente esa línea en el código C#. –

+0

Sí, pero ¿cómo puedo lograrlo en php? ¿Qué función debo usar? –

4

Su código C# toma los bytes UTF8 de la cadena; calcula md5 y almacena como codificado en base64. Por lo que debe hacer lo mismo en php, que debe ser:

$hashValue = base64_encode(md5(utf8_decode($inputString))) 
0

Tuve el mismo problema ... usar solo md5 ($ myvar) funcionó. Estoy obteniendo el mismo resultado C# y PHP.

-1

publicado por Gavin Kendall me ayudó. Espero que esto ayude a otros.

http://jachman.wordpress.com/2006/06/06/md5-hash-keys-with-c/

public static string MD5Hash(string text) 
{ 
    System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
    return System.Text.RegularExpressions.Regex.Replace(BitConverter.ToString(md5.ComputeHash(ASCIIEncoding.Default.GetBytes(text))), “-”, “”); 
} 
1

Debe ser como la siguiente para php

php -r "echo base64_encode(md5(utf8_encode('asd'),true));" 
Cuestiones relacionadas