Конечно, оставлять. Например, если убивать нули, такая строка e1adc3 может быть понята, как e1 ad c3 или как e1 0a 0d c3 и еще кучей способов. Если каждый байт записывается в виде ровно двух символов, такой неопределенности не возникает. Как вариант можно писать хеш в файл в бинарном виде.
Всем привет!
Минут 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.
Запустив все это дело я с удивлением обнаружил, что для одних и тех же данных хеш-коды на клиенте и на сервере — разные... посравнивал хеши и вот что получилось:
ну, это вполне достаточно, чтобы понять...
Итак, невооруженным взглядом видна причина проблемы: полученный хеш по-разному преобразовывается в строку. В тех случаях, когда получается байт со значением, например 15 или тому подобным, сишный алгоритм пишет в строку "0f", другой же этот ноль отбрасывает и пишет просто "f".
Вот теперь, собственно, вопрос: а как принято писать их правильно? ведущие нули оставлять или убивать их?
Вы наверное используете нечто типа Convert.ToString(i, 16) при конвертировании хэша в строку, для значений меньше 16 он не будет возвращать первый 0, как вариант напишите свой Format Provider, ну или так проверяйте
Здравствуйте, SnowMan, Вы писали:
SM>Конечно, оставлять. Например, если убивать нули, такая строка e1adc3 может быть понята, как e1 ad c3 или как e1 0a 0d c3 и еще кучей способов. Если каждый байт записывается в виде ровно двух символов, такой неопределенности не возникает. Как вариант можно писать хеш в файл в бинарном виде.
а зачем тебе такая определенность для хеша? Хеш не предназначен для того чтобы из него легче было получить исходные данные по которым он сформирован...

Главное чтобы для одного набора данных хеш всегда получался одинаковый...
Тот кто знает не говорит, тот кто говорит не знает.
Здравствуйте, Стример, Вы писали:
С>а зачем тебе такая определенность для хеша? Хеш не предназначен для того чтобы из него легче было получить исходные данные по которым он сформирован...
Главное чтобы для одного набора данных хеш всегда получался одинаковый...
Поясняю: много где, много когда к разным файлам и т.п. дается их MD5 хеш для проверки... и дается он обычно уже в hex-виде. вот и вопрос: по каким правилам принято енту строчку формировать?
Здравствуйте, _Sphinx_, Вы писали:
_S_>8e24a6a0424e0f906c04afc02cbc629d |
_S_>8e24a6a0424ef906c4afc02cbc629d |
_S_>ну, это вполне достаточно, чтобы понять...
_S_>Итак, невооруженным взглядом видна причина проблемы: полученный хеш по-разному преобразовывается в строку. В тех случаях, когда получается байт со значением, например 15 или тому подобным, сишный алгоритм пишет в строку "0f", другой же этот ноль отбрасывает и пишет просто "f".
_S_>Вот теперь, собственно, вопрос: а как принято писать их правильно? ведущие нули оставлять или убивать их?
подозреваю что проблема не в алгоритме, а в вашей программе, которая при переводе байта в текст не дополняет его нулем при необходимости
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>