MD5 хеш отличается - PullRequest
       38

MD5 хеш отличается

6 голосов
/ 29 ноября 2010

Я не знаю, как реализовать эти несколько строк от PHP до Java ..

$varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/>
$result = md5($varInHex);
echo $result;

Ну, я пытался преобразовать его, но я получаю другой результат!

byte[] seq20 = new byte[]{(byte)0x22,(byte)...etc...};
String str = seq20.toString();
String result = md5(str);
System.out.println(result);

public static String md5(String source) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(source.getBytes("UTF-8"));
        return getString(bytes);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

private static String getString(byte[] bytes) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < bytes.length; i++) {
        byte b = bytes[i];
        String hex = Integer.toHexString((int) 0x00FF & b);
        if (hex.length() == 1) {
            sb.append("0");
        }
        sb.append(hex);
    }
    return sb.toString();
}

результат в Java отличается от результата в PHP ..

Можете ли вы помочь мне, пожалуйста, ??Заранее спасибо:)

Ответы [ 5 ]

5 голосов
/ 31 августа 2012

Ни один из двух других ответов не является положительно неправильным, но с точки зрения элегантности рассмотрим следующее

String MD5(String... strings) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
        for(final String s : strings) {
            md.update(s.getBytes());
        }
    } catch (NoSuchAlgorithmException ex) {
        throw new RuntimeException("MD5 Cryptography Not Supported");
    }
    final BigInteger bigInt = new BigInteger(1, md.digest());
    return String.format("%032x", bigInt);
}

edit: Использование String... varargs совершенно необязательно, но делает функцию немного проще, поскольку позволяет избежать накладных расходов на конкатенацию строк в вызывающей функции.

5 голосов
/ 29 ноября 2010

Разве вы не можете использовать seq20 напрямую, не преобразовав его в строку? Я бы сделал это так:

md.update( seq20 ); 
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
while ( output.length() < 32 ) {
    output = "0"+output;
}
3 голосов
/ 15 мая 2011

Принимаемое решение:

md.update( seq20 ); 
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
if ( output.length() == 31 ) {
    output = "0"+output;
}

содержит реализацию, которая завершится с ошибкой 1/256 раз, поскольку вывод md5sum может иметь более одного начального нуля. Пример ввода md5, который вызовет эту ошибку: «15446: 68106» (без кавычек).

Я рекомендую использовать Apache Commons DigestUtils.md5Hex , если вам нужен md5, соответствующий реализации php.

2 голосов
/ 29 ноября 2010

Взгляните на: http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/

Эта ссылка была размещена здесь: Java md5, путь PHP

0 голосов
/ 29 ноября 2010

Я предполагаю, что PHP оценивает вышеупомянутое как строку, а не как шестнадцатеричное.И Java делает это так, как вы ожидаете.

...