Почему, когда я конвертирую одну и ту же строку C ++ в хэш MD5, я получаю каждый раз разные выходные данные? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть строка, преобразованная в хеш MD5 с использованием скрипта Python со следующей командой:

admininfo['password'] = hashlib.md5(admininfo['password'].encode("utf-8")).hexdigest()

Это значение теперь хранится в онлайн-базе данных.

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

Но, предоставляя одну и ту же строку, я каждый раз получаю другое хеш-значение MD5.

Как это исправить?

cin >> Admin_pwd;
cout << endl;

unsigned char digest[MD5_DIGEST_LENGTH];
const char* string = Admin_pwd.c_str();

MD5((unsigned char*)&string, strlen(string), (unsigned char*)&digest);    

char mdString[33];

for(int i = 0; i < 16; i++)
    sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);

printf("md5 digest: %s\n", mdString);

Первая попытка:

md5 digest: dcbb3e6add7fb94b98c56d7f70b7c46e

Вторая попытка:

md5 digest: 2870f4de491ad17d53d6d6e9dae19ca9

Третья попытка:

md5 digest: 84656428baf461093e9fca2c8b05a296

Ответы [ 2 ]

3 голосов
/ 07 июля 2019
(unsigned char*)&string

Вы хэшируете сам указатель (и неопределенные данные после него), а не строку, на которую он указывает.

И он изменяется при каждом выполнении (возможно).

Вы имели в виду только (unsigned char*)string.

2 голосов
/ 07 июля 2019

Сделай это MD5((unsigned char*)string, ...);бросьте амперсанд.Вы не передаете символьные данные в MD5 - вы передаете значение самого указателя string (а именно, адрес первого символа пароля) плюс любой мусор, который окажется в стеке после него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...