Хеширование MD5 в Delphi 2009

Вы не можете сделать это. Только поставщик SMS по умолчанию может удалять SMS из хранилища содержимого. Вы должны зарегистрироваться как поставщик содержимого SMS для удаления SMS (когда ваше приложение помечено пользователем как поставщик SMS по умолчанию в параметре приложений по умолчанию).

6
задан Mihai Limbășan 28 December 2008 в 11:48
поделиться

6 ответов

Ваша библиотека не является знающим Unicode. Просто передав его AnsiString не будет достаточно, потому что это, вероятно, использует строки внутренне, чтобы хранить данные.

Вы могли попытаться обновить ту библиотеку, ожидать автора, чтобы обновить его или просто использовать MessageDigest_5.pas, который поставляет с Delphi 2009. Это находится в source\Win32\soap\wsdlimporter папке, которую Вы должны будете или добавить к своему пути, или явно включать его в свой проект.

Вот некоторый пример кода с помощью него в Delphi 2009:

uses Types, MessageDigest_5;

procedure TForm16.Edit1Change(Sender: TObject);
var
  MD5: IMD5;
begin
  MD5 := GetMD5;
  MD5.Init;
  MD5.Update(TByteDynArray(RawByteString(Edit1.Text)), Length(Edit1.Text));
  Edit2.Text := LowerCase(MD5.AsString);
end;

И Вы находитесь в бизнесе:

MD5 (123456) = e10adc3949ba59abbe56e057f20f883e

Вы могли перенести его в простой вызов функции, если бы Вы хотели. Важно, чтобы Вы бросили в RawByteString прежде, чем бросить в TByteDynArray, так как RawByteString бросают, отбрасывает все дополнительные символы Unicode. Предоставил, содержит ли редактирование символы Unicode затем, Вы могли бы закончить с неправильными данными.

Следует иметь в виду, что GetMD5 возвращает интерфейс, таким образом, это - считаемая ссылка и т.д.

Веселого Рождества!

30
ответ дан 8 December 2019 в 02:35
поделиться

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

Первое, что вам нужно понять, это то, что алгоритмы хеширования и шифрования работают на уровне байтов. Это означает, что им все равно, что вы хешируете или шифруете. Вы можете хешировать целые числа, символы, обычный ASCII, полный юникод, байты, длинные слова и т. Д. Алгоритм не имеет значения.

При работе со строками, Единственное, что вам нужно убедиться, это то, что внутренняя функция вашей библиотеки хэширования возвращает AnsiString в функции, которая выплевывает ваш результирующий хеш. Вот и все. Вот и все, что имеет значение.

Ваш реальный код для ВАШЕГО проекта может (и должен) быть основан на обычном вводе строки, который отображается в unicodestring в Delphi 2009. Вы не должны вводить что-либо типом в ansistring или rawbytestring. Тем самым вы немедленно создаете сломанный хеш, если и когда пользователь пытается что-то хэшировать за пределами набора символов ANSI. А в мире хеширования сломанный хеш является ненадежным и ненадежным.

не может быть типизацией чего-либо в ANISTring или rawbytestring. Тем самым вы немедленно создаете сломанный хеш, если и когда пользователь пытается что-то хэшировать за пределами набора символов ANSI. А в мире хеширования сломанный хеш является ненадежным и ненадежным.

не может быть типизацией чего-либо в ANISTring или rawbytestring. Тем самым вы немедленно создаете сломанный хеш, если и когда пользователь пытается что-то хэшировать за пределами набора символов ANSI. А в мире хеширования сломанный хеш является ненадежным и ненадежным.

5
ответ дан 8 December 2019 в 02:35
поделиться

Вы проверили, что Ваша библиотека была правильно обновлена для D2009 и unicodification? Я вид сомнения тот же код сделал бы D7/D2007 и D2009 для этого вида вещей.

1
ответ дан 8 December 2019 в 02:35
поделиться

Вы случайно бросаете универсальную строку (который в Delphi 2009 является UnicodeString) к PAnsiChar и передаче это в хеш-функцию? Это не будет работать. Сначала необходимо бросить строку в AnsiString и затем бросить тот один в PAnsiChar, а-ля:

PAnsiChar(AnsiString('123456'))

Кроме того, попытайтесь использовать RawByteString вместо AnsiString как предложенный dmajkic. Избегайте UTF8String, так как это не AnsiString и любые символы вне диапазона ASCII (0.. 127), мог бы быть дан иное толкование в многобайтовые символы.

0
ответ дан 8 December 2019 в 02:35
поделиться

В ответе Jim:

если мы изменяемся

MD5. Обновление (TByteDynArray (RawByteString (Edit1. Текст)), длина (Edit1. Текст));

кому:

MD5. Обновление (TByteDynArray (RawByteString (Edit1. Текст)), длина (RawByteString (Edit1. Текст)));

будет поддерживать лучше, в то время как китайские символы существуют.

-3
ответ дан 8 December 2019 в 02:35
поделиться

Очевидно, что Ваш lib не является включенным unicode.

Преобразуйте свою строку в AnsiString или RawByteString или UTF8String путем объявления временного AnsiString и присвойте строку uniode ему.

Обратите внимание, что при использовании unicode определенных символов, которые не могут быть переведены в единственную кодовую страницу, необходимо преобразовать строку в UTF8.

Затем назовите MD5 (PAnsiChar (YourTempString)).

Проверьте, что Ваш lib может иметь PWideChar или объявления UNICODE, для пропуска этого.

1
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: