2010-11-15 11 views
7

He estado trabajando en esto durante horas, pero no puedo hacerlo funcionar.Java md5, el modo PHP

Básicamente estoy desarrollando un cliente REST en Java para un servidor REST en PHP. Tanto el cliente como el servidor tienen que calcular el md5 de una cadena y el servidor los comparará para la autenticación (un poco).

En el servidor, el código PHP es:

md5("getTokenapi_keybf8ddfs845jhre980543jhsjfro93fd8capi_ver1tokeniud9ER£jdfff"); 

que genera:

4d7b2e42c3dfd11de3e77b9fe2211b87 

Nice!

Este es el código para el cliente:

import java.security.*; 
.... 
String s = "getTokenapi_keybf8ddfs845jhre980543jhsjfro93fd8capi_ver1tokeniud9ER£jdfff"; 
byte[] bytesOfMessage = s.getBytes("UTF-8"); 
MessageDigest md = MessageDigest.getInstance("MD5"); 
byte[] thedigest = md.digest(bytesOfMessage);  

System.out.println("String2: " + thedigest);   
System.out.println("String3: " + new String(thedigest)); 

Eso genera:

String2: [[email protected] 
String3: M{.B�����{��!� 

¿Cómo puedo conseguir Java para calcular la suma md5 de la misma manera lo hace PHP, por favor?

Gracias, Dan

Respuesta

20

seguirlo:

public static String md5(String input) throws NoSuchAlgorithmException { 
    String result = input; 
    if(input != null) { 
     MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1" 
     md.update(input.getBytes()); 
     BigInteger hash = new BigInteger(1, md.digest()); 
     result = hash.toString(16); 
     while(result.length() < 32) { //40 for SHA-1 
      result = "0" + result; 
     } 
    } 
    return result; 
} 

código de http://web.archive.org/web/20140209230440/http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/

+0

Gracias, me encontré con que yo recta después de escribir la pregunta. Y funciona. – dan

3

encontrado a mí mismo:

import java.math.BigInteger; 
.. 
public static String md5(String input) throws NoSuchAlgorithmException { 
     String result = input; 
     if(input != null) { 
      MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1" 
      md.update(input.getBytes()); 
      BigInteger hash = new BigInteger(1, md.digest()); 
      result = hash.toString(16); 
      if ((result.length() % 2) != 0) { 
       result = "0" + result; 
      } 
     } 
     return result; 
    } 

Fuente: http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/

+2

Lol he eliminado mi publicación, 3 personas respondiendo esta pregunta con la misma respuesta son un poco ridículas ^^ – thecodeassassin

2

Está produciendo la salida de md5 sin formato, que es solo un grupo de bytes. Obtendrás el mismo resultado en php si dijeras md5 ("some string", true).

Necesita convertir los bytes a caracteres ascii en su lugar.

1

Necesita convertir el resultado en la representación HEX. Esto es lo que se hace en Fast MD5 library:

private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', 
      '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; 

    /** 
    * Turns array of bytes into string representing each byte as unsigned hex 
    * number. 
    * 
    * @param hash 
    *   Array of bytes to convert to hex-string 
    * @return Generated hex string 
    */ 
    public static String asHex(byte hash[]) { 
     char buf[] = new char[hash.length * 2]; 
     for (int i = 0, x = 0; i < hash.length; i++) { 
      buf[x++] = HEX_CHARS[(hash[i] >>> 4) & 0xf]; 
      buf[x++] = HEX_CHARS[hash[i] & 0xf]; 
     } 
     return new String(buf); 
    } 

por lo que tendrá que llamar System.out.println("String3: " + asHex(thedigest));

1

si utiliza marco de seguridad de la primavera, acaba de hacer:

import org.springframework.security.authentication.encoding.* 

new Md5PasswordEncoder().encodePassword("myWord",null) 

El mismo resultado que PHP::md5(). confirmo

See more examples