Всем привет!
Минут 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".
Вот теперь, собственно, вопрос: а как принято писать их правильно? ведущие нули оставлять или убивать их?