2010-11-15 12 views
7

Pracuję nad tym od wielu godzin, ale nie mogę go uruchomić.Java md5, sposób PHP

Zasadniczo opracowuję klienta REST w Javie dla serwera REST w PHP. Zarówno klient, jak i serwer muszą obliczyć wartość md5 ciągu znaków, a serwer porówna je w celu uwierzytelnienia (rodzaj).

Na serwerze kodu PHP jest:

md5("getTokenapi_keybf8ddfs845jhre980543jhsjfro93fd8capi_ver1tokeniud9ER£jdfff"); 

który generuje:

4d7b2e42c3dfd11de3e77b9fe2211b87 

Nice!

Oto kod dla klienta:

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)); 

który generuje:

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

Jak mogę uzyskać Java obliczyć MD5 podsumować w ten sam sposób PHP robi, proszę?

Dzięki, Dan

Odpowiedz

20

spróbuj tego:

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; 
} 

kod z 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

Dzięki, że znalazłem sobie prosto po napisaniu pytanie. I działa. – dan

3

znalazłam:

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; 
    } 

Źródło: http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/

+2

Lol usunąłem mój post, 3 osoby odpowiadające na to pytanie z tą samą odpowiedzią są trochę śmieszne^^ – thecodeassassin

2

Wysyłamy surowe wyjście md5, które jest po prostu garstką bajtów. Otrzymasz taki sam wynik w php, jeśli powiesz md5 ("jakiś ciąg", prawda).

Zamiast tego należy przekonwertować bajty na znaki ASCII.

1

Musisz przekonwertować wynik na reprezentację HEX. Jak to jest zrobione w 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); 
    } 

Więc trzeba będzie zadzwonić System.out.println("String3: " + asHex(thedigest));

1

jeśli używasz Spring Framework zabezpieczeń, po prostu zrobić:

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

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

taki sam wynik jak PHP::md5(). Potwierdzam

See more examples