Сбой MD5 для больших строк - PullRequest
0 голосов
/ 10 февраля 2010

Я делаю MD5-хэш ответа, а затем подписываю его общим секретом.

Для большинства вызовов это работает, но, как ни странно, не удается (генерирует хеш MD5, отличный от клиента) только для двух вызовов, которые приносят много содержимого в тело.

Может ли это быть из-за размера тела? или, может быть, потому что эти вызовы возвращают содержимое chunked?

Любая идея будет оценена. Большое спасибо.

Код хеширования (обратите внимание, что algorithm == MD5 и ENCODING == 'UTF-8'):

private static byte[] hash(String toHash, String algorithm){
      try{
      MessageDigest dg = MessageDigest.getInstance(algorithm);
      dg.update(toHash.getBytes(ENCODING));
      return dg.digest();
    }catch(Exception e){
      throw new ApiInternalException("Error while hashing string: " + toHash,e);
    }
    }

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

Было бы здорово, если бы вы включили свой код. Без этого я могу только догадываться, в чем проблема. В любом случае, вот правильный способ создания хеша MD5 в Java. Если ваш код отличается от этого, значит, у вас проблема.

String plainString = "Hash me please";
String md5Hash = "NOTHASHED";
try {
     MessageDigest md5Digest = MessageDigest.getInstance("MD5");
     md5String = new String(md5Digest.digest(plainString.getBytes()));
} catch (NoSuchAlgorithmException nsae) {
     // MD5 is included in all versions of Java, this can never happen
}

Конечно, это вернет что-то похожее на: �ǚ���;�f���&fu Если вы хотите, чтобы он был удобочитаемым человеком, обычно рекомендуется его кодировать в Bas64, и в этом случае просто используйте строку:

new String(Base64Encoder.encode((md5Digest.digest(DESKTOP_STRING.getBytes()))));

Что даст вам нечто похожее на: ssea19zwO6Jm3AiF4SZmdQ==

Помните, что вам нужно отменить код позже, прежде чем использовать его как хэш md5.

0 голосов
/ 10 февраля 2010

Любое объяснение правдоподобно. Другие возможные объяснения включают в себя:

  • что-то (может быть, прокси-сервер) изменяет содержимое при передаче,
  • существует несоответствие в способе кодирования / декодирования символов
  • На самом деле повреждены хеши MD5.

Вам нужно собрать больше информации, чтобы понять, что это. Я предлагаю вам изменить стороны клиента и сервера, чтобы записывать отправляемые / получаемые данные в файлы, перемещать их на одну и ту же машину и выполнять побайтное сравнение. Другие вещи, которые вы могли бы попробовать, включают в себя отключение фрагментирования и вывод / сравнение контрольных сумм MD5 на обоих концах.

РЕДАКТИРОВАТЬ : Это также поможет нам, если вы разместите код, который выполняет вычисление контрольной суммы MD5 на обоих концах, и код, который кодирует / декодирует контрольные суммы для передачи (например, используя шестнадцатеричное, base64). или что угодно).

...