编辑
我把$checksum = md5($someString+$bkey);
改成了$checksum = md5($someString.$bkey);
我需要在 Java 中执行以下操作:
$hexString = '90aa';#sample value
$bkey = pack('H*',$hexString);
$someString='qwe';#sample value
$checksum = md5($someString.$bkey);
echo $checksum;
我无法在 Java 中将 hexString 转换为 bkey 以获得与 php 脚本相同的结果。除了bkey
一切都正常工作。
如果我删除bkey
则:
.PHP:
$someString='qwe';#sample value
$checksum = md5($someString);
echo $checksum;
结果:76d80224611fc919a5d54f0ff9fba446
爪哇岛:
String someString = "qwe";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
String checksum = new BigInteger(1, messageDigest.digest(someString
.getBytes())).toString(16);
System.out.println(checksum);
结果:76d80224611fc919a5d54f0ff9fba446
如您所见,它可以工作
bkey
:
.PHP:
$hexString = '90aa';#sample value
$bkey = pack('H*',$hexString);
$someString='qwe';#sample value
$checksum = md5($someString.$bkey);
echo $checksum;
结果:18f5f1a9bf898131945dd9e315759fe4
爪哇岛:
public static void main(String[] args) throws NoSuchAlgorithmException {
String hexString = "90aa";
String bkey = hexToString(hexString);
String someString = "qwe";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
String input = someString + bkey;
String checksum = new BigInteger(1, messageDigest.digest(input
.getBytes())).toString(16);
System.out.println(checksum);
}
public static String hexToString(String hex) {
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i += 2) {
String str = hex.substring(i, i + 2);
output.append((char) Integer.parseInt(str, 16));
}
return output.toString();
}
结果:44bb634dee436833dd65caa5043ffeb9
如您所见,结果是不同的。
如何将hex String
转换为String
以获得相同的结果?
问题实际上不在于你的Java代码,而在于PHP代码。
$checksum = md5($someString+$bkey);
行没有按照您的想法进行操作,它应该是:
$checksum = md5($someString . $bkey); # use concatenate, not sum
虽然,这给了更好的PHP MD5,但无助于使Java代码与PHP匹配。
编辑
Java端的问题在于字符编码。90aa
的 java 字符值不是有效的 unicode 字符。因此,toByteArray() ,ethods ar enot 做伟大的事情。如果你在字节级别处理所有 Java 代码(并忽略 Java 中任何字符中的任何高字节),那么你会得到与 PHP 相同的结果:
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
String hexString = "90aa";
byte[] bkey = hexToString(hexString);
String someString = "qwe";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] input = join(stringToBytes(someString), bkey);
String checksum = new BigInteger(1, messageDigest.digest(input)).toString(16);
System.out.println(checksum);
System.out.println(Charset.defaultCharset().displayName());
}
private static byte[] join(byte[] a, byte[] b) {
// join two byte arrays
final byte[] ret = new byte[a.length + b.length];
System.arraycopy(a, 0, ret, 0, a.length);
System.arraycopy(b, 0, ret, a.length, b.length);
return ret;
}
public static byte[] hexToString(String hex) {
// hexToString that works at a byte level, not a character level
byte[] output = new byte[(hex.length() + 1) / 2];
for (int i = hex.length() - 1; i >= 0; i -= 2) {
int from = i - 1;
if (from < 0) {
from = 0;
}
String str = hex.substring(from, i + 1);
output[i/2] = (byte)Integer.parseInt(str, 16);
}
return output;
}
public static byte[] stringToBytes(final String input) {
// unlike Stirng.toByteArray(), we ignore any high-byte values of the characters.
byte[] ret = new byte[input.length()];
for (int i = input.length() - 1; i >=0; i--) {
ret[i] = (byte)input.charAt(i);
}
return ret;
}
上面的Java代码产生了MD5sum 18f5f1a9bf898131945dd9e315759fe4
这也是PHP给出的