$checksum = md5($someString+$bkey);
to $checksum = md5($someString.$bkey);
Мне нужно выполнить следующие операции в Java:
$hexString = '90aa';#sample value $bkey = pack('H*',$hexString); $someString='qwe';#sample value $checksum = md5($someString.$bkey); echo $checksum;
Я не могу преобразовать hexString в bkey в Java, чтобы получить тот же результат, что и 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 заключается в кодировке символов. Значения символов Java для inoacked версий 90aa
являются недопустимыми символами Unicode. Таким образом, toByteArray (), этады делают великие дела. Если вы обрабатываете весь код 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.