Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/212: Рейтинг темы: голосов - 212, средняя оценка - 4.77
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2

Получить MD5 хэш введенного текста

25.07.2010, 16:25. Показов 44627. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите какую библиотеку нужно подключить и где её взять чтобы получить мд5 хэш текста? облазил интернет ничего рабочего не нашел
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2010, 16:25
Ответы с готовыми решениями:

Как получить MD5-хэш введенного пароля?
Всем доброго времени суток. Сейчас пишу простенький лаунчер для своего сервера и он должен брать данные из базы данных. В базе пароли...

Перевод текста в md5 хэш
подскажите как перевести переменную в md5 хэш? Пробовал так: <?php $Str = 'apple'; echo md5($Str); ?> и так пробовал: ...

Получить MD5-хэш для строк
вот как получить мд5 через пробел от такого отрывка кода: Console.WriteLine(s7 + i.ToString() + s2 + s0); мне надо чтобы было бы так: ...

47
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
18.08.2012, 19:18
Студворк — интернет-сервис помощи студентам
не, лучше попробуйте файл в 1гб
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
18.08.2012, 19:37
kzru_hunter, пробуй остряк:

C++
1
2
3
AnsiString g = "IDontGiveAFuсk, ISeriously";
Memo1->Lines->Add( md5_noerrors(g.c_str(),g.Length()) );
Memo1->Lines->Add( MD5(g) );
Можешь поиграться с буквой "С"
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
19.08.2012, 12:24
QVO на первый раз прощаю

Оказывается можно и большие файлы хешировать с помощью CryptoAPI (я лично не знал об этом).
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
AnsiString MD5FromFile(char *szFileName, char *szErrorText = NULL, int iErrorLength = 0);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        char szError[512];
        String sMD5 = MD5FromFile("D:\\obraz.iso", szError, 512);
        if (sMD5 != -1) ShowMessage(sMD5);
        else ShowMessage(szError);
}
//---------------------------------------------------------------------------
 
AnsiString MD5FromFile(char *szFileName, char *szErrorText, int iErrorLength)
{
        #define SET_ERROR_FOR(FUNC) if (szErrorText) strncpy(szErrorText, ( "Error " FUNC ": " + SysErrorMessage(GetLastError()) ).c_str(), iErrorLength)
        #define RELEASE_RESOURCES()  if (hProv) CryptReleaseContext(hProv, 0); \
                                   if (hHash) CryptDestroyHash(hHash); \
                                   delete szBuffer; \
                                   delete fs
 
        const int BUFSIZE = 10240;
        const int MD5LEN = 16;
 
        HCRYPTPROV hProv = 0; // õåíäë êðèïòîïðîâàéäåðà
        HCRYPTHASH hHash = 0; // õåíäë õåø-îáúåêòà
        BYTE szHash[MD5LEN];  // õåø (16 áàéò)
        TFileStream *fs = 0;
        DWORD cbHash = MD5LEN;
        UCHAR *szBuffer = new char[BUFSIZE]; // áëîê äàííûõ, êîòîðûé áóäåò õåøèðîâàòüñÿ
 
        // -------------------------------------- Îòêðûâàåì ôàéë äëÿ ÷òåíèÿ ------------------------------------------
        try
        {
                fs = new TFileStream(szFileName, fmOpenRead);
        }
        catch(Exception &ex)
        {
                if (szErrorText) strncpy(szErrorText, ("Error TFileStream: " + ex.Message).c_str(), iErrorLength);
                return  -1;
        }
        // ------------------------------------------------------------------------------------------------------------
 
        // ------------------- Ïîëó÷àåì õåíäë êðèïòîïðîâàéäåðà PROV_RSA_FULL -------------
        if ( !CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) )
        {
                SET_ERROR_FOR("CryptAcquireContext");
                RELEASE_RESOURCES();
                return -1;
        }
        // -------------------------------------------------------------------------------
 
        // -------- Ñîçäàåì õåø-îáúåêò (MD5) è ïîëó÷àåì åãî õåíäë ----------
        if ( !CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash) )
        {
                SET_ERROR_FOR("CryptCreateHash");
                RELEASE_RESOURCES();
                return -1;
        }
        // -----------------------------------------------------------------
 
        // --------------------- Áëî÷íî õåøèðóåì âåñü ôàéë ----------------
        int cbRead;
        while ( (cbRead = fs->Read(szBuffer, BUFSIZE)) != 0 )
        {
                if ( !CryptHashData(hHash, szBuffer, cbRead, 0) )
                {
                        SET_ERROR_FOR("CryptHashData");
                        RELEASE_RESOURCES();
                        return -1;
                }
        }
        // ----------------------------------------------------------------
 
        // ------ Ïîëó÷àåì çíà÷åíèå õåøà â âèäå ñòðîêè HEX-ôîðìàòà ------
        String sMD5; sMD5.SetLength(MD5LEN*2+1); sMD5[MD5LEN*2+1] = 0;
        if ( !CryptGetHashParam(hHash, HP_HASHVAL, szHash, &cbHash, 0) )
        {
                SET_ERROR_FOR("CryptGetHashParam");
                RELEASE_RESOURCES();
                return -1;
        }
        else
        {
                BinToHex(szHash, sMD5.c_str(), MD5LEN);
        }
        // --------------------------------------------------------------
 
        // Îñâîáîæäàåì ðåñóðñû
        RELEASE_RESOURCES();
 
        return sMD5;
 
        #undef SET_ERROR_FOR
        #undef RELEASE_RESOURCES
}
Тоже самое под консольное приложение:
Example C Program: Creating an MD5 Hash from File Content
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
20.08.2012, 17:21
kzru_hunter,

Не по теме:

прощаешь что?



Причем тут файлы? Я дал конкретный пример проблемы функций md5.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
20.08.2012, 18:38
Цитата Сообщение от QVO Посмотреть сообщение
Причем тут файлы? Я дал конкретный пример проблемы функций md5.
у меня все ок; проверял через Hash Tab (создавал файл, заносил текст и через свойства файла смотрел md5).
а если проверять md5 на каком-нибудь сайте, то может отобразиться неправильный md5.
проверил первые сайты, которые выдал гугл, и все они неправильно посчитали md5 (разные значения выдавали) для строки "IDontGiveAFuсk, ISeriously"
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
23.08.2012, 01:13
Добавлено через 1 час 7 минут
Вопрос снят, дело в кодировки.
0
0 / 0 / 1
Регистрация: 21.02.2014
Сообщений: 19
06.11.2014, 18:41
Всем спасибо. Полезная тема.
0
9 / 9 / 6
Регистрация: 14.09.2016
Сообщений: 41
21.04.2021, 12:53
Ответы на все вопросы:
Итак, MikeSoft предложил использовать встроенную библиотеку Indy для получения MD5-хеша:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <IdHashMessageDigest.hpp>
//---------------------------------------------------------------------------
String __fastcall MD5(const String Text)
{
  String result;
  TIdHashMessageDigest5 *idmd5 = new TIdHashMessageDigest5();
  try {
    result = idmd5->HashStringAsHex(Text);
  }
  __finally {
    delete idmd5;
  }
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Edit2->Text = MD5( Edit1->Text );
}
//---------------------------------------------------------------------------
Это все прекрасно работает, но только с латиницей, причем совпадает с md5 значениями, вычисленными на открытых сайтах, достаточно в поисковике набрать md5 hash online
С кириллицей начинаются проблемы: результат вычислений не зависит от регистра.
Дело в том, функция idmd5->HashStringAsHex(Text) преобразует юникодную двухбайтную последовательность в однобайтную.
Что в случае с латиницей - нормально, а с кириллицей - получается непонятка, поскольку, как именно она преобразует, мы посмотреть не можем.
Выход следующий: надо воспользоваться функцией HashStreamAsHex()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <IdHashMessageDigest.hpp>
//---------------------------------------------------------------------------
String __fastcall MD5_v2(const String Text)
{
  String result;
  TMemoryStream *stream = new TMemoryStream();
 
  const char* Buf = (const char*)Text.c_str();
  int   size = Text.Length();
  stream->Write( Buf, size*2 ); // Умножаем на 2, т к юникод содержит по 2 байта
  stream->Position = 0;         // Важно не забыть поставить поток на начало
 
  TIdHashMessageDigest5 *idmd5 = new TIdHashMessageDigest5();
  try { result = idmd5->HashStreamAsHex( stream );  }
  __finally
  {
    delete idmd5;
    delete stream;
  }
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Edit2->Text = MD5_v2( Edit1->Text );
}
//---------------------------------------------------------------------------
Эта функция совершенно точно будет выдавать разные результаты на разные регистры, и вообще индивидуальный md5 на любой текст, так что в своих программах для проверки пользовательских паролей - вполне пойдет.
Единственно, эти хэши перестанут совпадать с официальными.
Дело в том, что вы хэшируете юникодную последовательность байтов, а на сайтах, обычно utf-8 кодировку.
Если очень хочется получать официальные хэши, то надо юникод строку сначала преобразовать в utf-8 последовательность байтов.
Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <IdHashMessageDigest.hpp>
//---------------------------------------------------------------------------
String __fastcall MD5_buf( char* buf, int buf_size )
{
  String result;
  TMemoryStream *stream = new TMemoryStream();
  stream->Write( buf, buf_size );
  stream->Position = 0;
 
  TIdHashMessageDigest5 *idmd5 = new TIdHashMessageDigest5();
  try {
    result = idmd5->HashStreamAsHex( stream );
  }
  __finally
  {
    delete idmd5;
    delete stream;
  }
 
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int Len = Edit1->Text.Length();
  int max_size = 6*Len + 1; // Максимальное число байтов на символ в utf-8 шесть плюс нулевое окончание строки
  char * u8_buf = new char[max_size];
  int u8_buf_size = UnicodeToUtf8( u8_buf, Edit1->Text.c_str(), max_size ); // Возвращает сформированное кол-во байт
  Edit2->Text = MD5_buf( u8_buf, u8_buf_size-1 ); // нулевой символ откидываем
  delete [] u8_buf;
}
//---------------------------------------------------------------------------
Rapsod все допытывался, как захэшировать весь файл.
Вот с файлом - просто, там нет кодировок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <IdHashMessageDigest.hpp>
//---------------------------------------------------------------------------
String __fastcall MD5_stream( TStream* stream )
{
  String result;
  TIdHashMessageDigest5 *idmd5 = new TIdHashMessageDigest5();
  try {
    result = idmd5->HashStreamAsHex( stream );
  }
  __finally
  {
    delete idmd5;
  }
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if( ! OpenDialog1->Execute() ) return;
 
  TFileStream *stream = new TFileStream( OpenDialog1->FileName, fmOpenRead );
  Edit4->Text = MD5_stream( stream );
  delete stream;
}
//---------------------------------------------------------------------------
Ну, вот, как-то так.
Всем спасибо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2021, 12:53

Получить MD5-хэш для значения из базы данных
вот как мне написать код который как бы в базе данных будет то есть вот для буквы а мд5 является...

Ввести в форму слово и получить его md5 и sha1 хэш.
Подскажите пожалуйста как ее использовать? &lt;?php $str = 'слово'; if (sha1($str) ===...

Разгадать хэш md5
Сразу скажу - не уверен, что написал в нужный раздел. Дан хэш c616af471d8d523d5da90b01515deb09fhgtsawsdsdfaw ...

Неполный хэш MD5
Добрый вечер. Сегодня пытался реализовать функцию хеширования по одному примеру. Но почему в итоге вычисления получается не совсем полный...

Хэш sha1 и md5
Посчитать хэш sha1 и md5 выбранный пользователем файл алгоритмом . Использовать стандартную реализацию алгоритмов в .NET. Для md5 этот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
48
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru