Re: Реализация алгоритма MD5
От: SnowMan  
Дата: 22.12.06 17:32
Оценка: 2 (1)
Конечно, оставлять. Например, если убивать нули, такая строка e1adc3 может быть понята, как e1 ad c3 или как e1 0a 0d c3 и еще кучей способов. Если каждый байт записывается в виде ровно двух символов, такой неопределенности не возникает. Как вариант можно писать хеш в файл в бинарном виде.
Реализация алгоритма MD5
От: _Sphinx_ Россия http://www.rogov.su
Дата: 22.12.06 16:48
Оценка:
Всем привет!

Минут 15 думал куда это запостить, так и не придумал... Решил сюда...

Делал тут тривиальное хранение паролей на диске ну и решил писать в файлы MD5 хеши. У меня сервер на C++ (native) а клиенты под .NET. На сервер работает алгоритм вычисления хеша, взятый, насколько я понимаю, из поставки FreeBSD. По крайней мере в заголовочнике того файла ивеется комментарий вот такого вида:

/* MD5.H - header file for MD5C.C
 * $FreeBSD$
 */

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.

.....
 */


данный заголовок вызывает доверие и заставляет меня верить в то, что вычисление хеша там реализовано правильно... Соответственно, на клиенте хеши считаются с помощью MD5CryptoServiceProvider.

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

Source textMD5 in CMD5 in .NET
123456e10adc3949ba59abbe56e057f20f883ee1adc3949ba59abbe56e057f2f883e
Test dataca1ea02c10b7c37f425b9b7dd86d5e11ca1ea02c10b7c37f425b9b7dd86d5e11
1001100110018e24a6a0424e0f906c04afc02cbc629d8e24a6a0424ef906c4afc02cbc629d
ну, это вполне достаточно, чтобы понять...

Итак, невооруженным взглядом видна причина проблемы: полученный хеш по-разному преобразовывается в строку. В тех случаях, когда получается байт со значением, например 15 или тому подобным, сишный алгоритм пишет в строку "0f", другой же этот ноль отбрасывает и пишет просто "f".

Вот теперь, собственно, вопрос: а как принято писать их правильно? ведущие нули оставлять или убивать их?
ICQ: 203-009-172
Re[2]: Реализация алгоритма MD5
От: _Sphinx_ Россия http://www.rogov.su
Дата: 22.12.06 21:58
Оценка:
Здравствуйте, SnowMan, Вы писали:

SM>Конечно, оставлять. Например, если убивать нули, такая строка e1adc3 может быть понята, как e1 ad c3 или как e1 0a 0d c3 и еще кучей способов. Если каждый байт записывается в виде ровно двух символов, такой неопределенности не возникает. Как вариант можно писать хеш в файл в бинарном виде.


Ок, так и сделаем... Спасибо
ICQ: 203-009-172
Re: Реализация алгоритма MD5
От: ExD Россия  
Дата: 22.12.06 22:37
Оценка:
Вы наверное используете нечто типа Convert.ToString(i, 16) при конвертировании хэша в строку, для значений меньше 16 он не будет возвращать первый 0, как вариант напишите свой Format Provider, ну или так проверяйте
Re[2]: Реализация алгоритма MD5
От: Стример Украина  
Дата: 22.12.06 23:47
Оценка:
Здравствуйте, SnowMan, Вы писали:

SM>Конечно, оставлять. Например, если убивать нули, такая строка e1adc3 может быть понята, как e1 ad c3 или как e1 0a 0d c3 и еще кучей способов. Если каждый байт записывается в виде ровно двух символов, такой неопределенности не возникает. Как вариант можно писать хеш в файл в бинарном виде.


а зачем тебе такая определенность для хеша? Хеш не предназначен для того чтобы из него легче было получить исходные данные по которым он сформирован... Главное чтобы для одного набора данных хеш всегда получался одинаковый...
Тот кто знает не говорит, тот кто говорит не знает.
Re[3]: Реализация алгоритма MD5
От: _Sphinx_ Россия http://www.rogov.su
Дата: 23.12.06 08:52
Оценка:
Здравствуйте, Стример, Вы писали:

С>а зачем тебе такая определенность для хеша? Хеш не предназначен для того чтобы из него легче было получить исходные данные по которым он сформирован... Главное чтобы для одного набора данных хеш всегда получался одинаковый...


Поясняю: много где, много когда к разным файлам и т.п. дается их MD5 хеш для проверки... и дается он обычно уже в hex-виде. вот и вопрос: по каким правилам принято енту строчку формировать?
ICQ: 203-009-172
Re: Реализация алгоритма MD5
От: Morpheus_  
Дата: 26.12.06 10:37
Оценка:
Здравствуйте, _Sphinx_, Вы писали:

_S_>8e24a6a0424e0f906c04afc02cbc629d

_S_>8e24a6a0424ef906c4afc02cbc629d

_S_>ну, это вполне достаточно, чтобы понять...


_S_>Итак, невооруженным взглядом видна причина проблемы: полученный хеш по-разному преобразовывается в строку. В тех случаях, когда получается байт со значением, например 15 или тому подобным, сишный алгоритм пишет в строку "0f", другой же этот ноль отбрасывает и пишет просто "f".


_S_>Вот теперь, собственно, вопрос: а как принято писать их правильно? ведущие нули оставлять или убивать их?


подозреваю что проблема не в алгоритме, а в вашей программе, которая при переводе байта в текст не дополняет его нулем при необходимости
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.