Java md5,PHP方式

我已经工作了好几个小时,但是我无法让它工作。

基本上我正在使用Java开发REST客户端,用于PHP中的REST服务器。 客户端和服务器都必须计算字符串的md5,服务器将比较它们以进行身份​​validation(kinda)。

在服务器上,PHP代码是:

md5("getTokenapi_keybf8ddfs845jhre980543jhsjfro93fd8capi_ver1tokeniud9ER£jdfff"); 

产生:

 4d7b2e42c3dfd11de3e77b9fe2211b87 

太好了!

以下是客户端的代码:

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

这会产生:

 String2: [B@42e816 String3: M{.B     {  !  

我怎样才能让Java以与PHP相同的方式计算md5总和,拜托?

谢谢,丹

尝试一下:

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

代码来自http://web.archive.org/web/20140209230440/http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-或-MySQL的/

发现自己:

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

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

您正在输出原始md5输出,这只是一堆字节。 如果你说md5(“some string”,true),你会在php中获得相同的结果。

您需要将字节转换为ascii字符。

您需要结果转换为HEX表示。 这是在Fast MD5库中完成的 :

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

所以你需要调用System.out.println("String3: " + asHex(thedigest));

如果你使用spring安全框架,那就做:

 import org.springframework.security.authentication.encoding.* new Md5PasswordEncoder().encodePassword("myWord",null) 

PHP::md5()相同的结果。 我确定

查看更多示例