MD5 хэш рассчитывается по-разному на сервере - PullRequest
10 голосов
/ 30 марта 2009

Я выполняю некоторый код, написанный на C, который вызывает функцию хеширования md5 из библиотеки хеширования, которую написал кто-то другой (md5.c & md5.h). Странное поведение, которое я видел:

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

  1. Функциональность хеширования работает отлично при компиляции и запуске на моей машине OSX и хэш, который вычисляется именно так, как и должно будет.

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

Кто-нибудь знает, как именно это будет возможно? Его сводили с ума на прошлой неделе, и я не понимаю, почему это вообще возможно. Я также проверил его на другой машине, скомпилировал и выполнил, и он отлично работает. Просто когда я загружаю его на сервер, хеш больше не верен.

Файл функциональности хеширования можно найти по адресу: http://people.csail.mit.edu/rivest/Md5.c

решено: спасибо всем Это была проблема 64-битной арки. Это сильно раздражает, что это ускользнуло от меня, чтобы учесть это при отладке .......

Ответы [ 5 ]

21 голосов
/ 30 марта 2009

Попробуйте заменить (Md5.c строка 41)

typedef unsigned long int UINT4;

от

typedef uint32_t UINT4;

(при необходимости включите stdint.h)

На 64-битной машине long int обычно (обычно) 64-битный вместо 32

РЕДАКТИРОВАТЬ :

Я попробовал 64-битный оптерон, это решает проблему.

2 голосов
/ 30 марта 2009

Машина, которая, кажется, не работает с другой архитектурой (32-битной или 64-битной), чем другие? Если реализация MD5 зависит от размера машинного слова (я не проверял код), это может привести к тому, что хеш будет другим.

1 голос
/ 30 марта 2009

Разные компиляторы могут иметь разные уровни соответствия стандартам. Если вы столкнетесь с нестандартным компилятором, вам может быть трудно увидеть, что хорошо протестированный код скомпилирован с чем-то совершенно другим.

Может также случиться, что целевая система является 64-битной, а код имеет проблемы с переносимостью в 64-битной версии.

Единственный способ решить эту проблему - отладить, когда две версии вашего кода ведут себя по-разному.

0 голосов
/ 30 марта 2009

Вы убедились, что читаете в двоичном режиме? В противном случае символ новой строки будет конвертирован по-другому в другой ОС.

0 голосов
/ 30 марта 2009

Извините, нет. Если я скомпилирую это и запусту на моем компьютере с Linux x86, он даст тот же результат, что и утилита md5sum:

peregrino:$ md5sum csrc/Md5.c 
d27fd5f04426a3ccb2390d7517f21b9c  csrc/Md5.c
peregrino:$ bin/Md5 csrc/Md5.c 
d27fd5f04426a3ccb2390d7517f21b9c csrc/Md5.c

На моей коробке x64:

sandiego:$ bin/Md5 src/Md5.c 
09679964608e3335c5c3e14572373eef src/Md5.c

Так что, похоже, проблема 64-битная, а не проблема Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...