Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > MD5 Delphi and PHP


Автор: Skinner 28.2.2010, 14:34
Всем привет ... В общем проблема такая .. нужно сохранять данные в базу в виде хеша сохранять функциями Делфы, а вот сверять их уже функциями PHP .. в итоге в конкретном случае MD5 показывает абсолютно разные результаты при сверки одинаковых строк (12345678) 

 Delphi -  f3b11c629052600e8fcd8a79687cd37c (dcpcrypt_2)
 PHP -     25d55ad283aa400af464c76d713c07ad (md5)

с начало думал проблема в кодировке но после того как оба проекта стали UTF-8 проблема не решилась 
еси кто знает как это вылечить то заранее благодарю!!

Автор: Alexeis 28.2.2010, 20:12
Skinner, может ошибка в использовании. В любом случае без кода никто не поможет. Телепаты в отпуске все.

Автор: Matematik 28.2.2010, 20:16
Цитата(Skinner @  28.2.2010,  14:34 Найти цитируемый пост)
еси кто знает как это вылечить

Использовать работающий код.
Вот архивчик, там 2 реализции - через WIN Api  и готовый алгоритм.
Оба дают 
Код

MD5('12345678') = 25d55ad283aa400af464c76d713c07ad


Но возможно не правильно используешь dcpcrypt.
Какой версии Delphi?

Автор: Skinner 1.3.2010, 03:43
dcpcrypt последний релиз с оф сайта под 2010 студию 

Код

function TForm1.DigestToStr(Digest: array of byte): string;
var
  i: Integer;
begin
  Result := '';
  for i := 0 to Length(Digest) - 1 do
    Result := Result + LowerCase(IntToHex(Digest[i], 2));
end;

function TForm1.GetStringHash(Source: string): string;
var
  Hash: TDCP_md5;
  Digest: array of Byte;
begin
  Hash := TDCP_md5.Create(Self); // создаём объект
  Hash.Init;                      // инициализируем
  Hash.UpdateStr(Source);
  SetLength(Digest,Hash.HashSize div 8);
  Hash.Final(Digest[0]);             // сохраняем её в массив
  Hash.Free;                      // уничтожаем объект
  Result := DigestToStr(Digest);  // получаем хэш-сумму строкой
end;


функции позаимствовал с одной из статей этого форума с какой точно не помню единственное доработал их исходя из демок производителя заменил массив Digest со статического на динамический!

http://forum.vingrad.ru/articles/s/ceabff086ee9724a1158849b7eb3d256/topic-219951/kw-dcpcrypt-delphi-%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%85%D1%8D%D1%88-%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F/view-all.html#st_0_view_0

Автор: Alexeis 1.3.2010, 10:44
Цитата(Skinner @  1.3.2010,  02:43 Найти цитируемый пост)
из демок производителя заменил массив Digest со статического на динамический!

  И не посмотрел на ожидаемый тип.

Код

procedure Final(var Digest); override;


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

Рекомендую в функции GetStringHash вернуть переменную 
Код

 Digest: array of Byte;

в первоначальный вид. MD5 все равно имеет фиксированный размер, так что нет смысла городить огород с динамическим массивом. Красивее не получиться.

Код

function TForm1.DigestToStr(Digest: array of byte): string;

Это параметр открытый массив, так что туда можно передавать любой массив, хоть динамический хоть статический.

Автор: Skinner 1.3.2010, 20:03
да не с рачка так болячка ... это наверное какой то закон подлости из архива с примерами ни один пример не повел себя адекватно нечего схожего с этим

Код

MD5('12345678') = 25d55ad283aa400af464c76d713c07ad


нет даже приблизительно 

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

Код

MD5('12345678') = 0f037584c99e7fd4f4f8c59550f8f507
 

это просто полтергейст какой то а не компьютер 

вот так использовал юниты из архива 

Код

interface

uses
  Umd5, Windows, Messages, SysUtils,

...
...

...

procedure TForm1.Button4Click(Sender: TObject);
begin
 Memo1.Lines.Add(md5(Edit1.Text));
end;

...
...
...




и в чем тут может быть проблема ................  smile 

Автор: Matematik 1.3.2010, 21:34
Skinner, 
В  Delphi 2009/2010 тип string стал равен UnicodeString, т.е. это теперь юникод.
Почитай:
http://edn.embarcadero.com/article/38446
http://edn.embarcadero.com/article/38582
http://edn.embarcadero.com/article/38703

Новой версии у меня нет, возможно проблема решается простым изменением типа строки

Код

function TForm1.GetStringHash(Source: AnsiString): AnsiString;

Автор: Skinner 3.3.2010, 14:38
Огромнае спасибо все получилось .. все таки это кодировка только не стой стороны что я думал .. спасибо  smile 

Автор: russjura 14.4.2010, 23:12
Друзья, спасибо, что просветили про unicode! Очень важное замечание! 

Теперь благодаря этому сравнил еще парочку примеров бесплатных, PHP функции md5 и sha1  и решения на dcpcrypt2 ТОРЖЕСТВЕННО СОВПАДАЮТ! 

Огромное спасиибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)