2013-08-25 3 views
0

При вычислении хэш-значения строчной кодированной строки я получил правильное значение.Неожиданное значение хеша MD5 с помощью openssl/md5

unsigned char digest[MD5_DIGEST_LENGTH]; 
char string[] = "fnamelname"; 
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("fullName: %s\n", string); 
printf("md5 digest: %s\n", mdString); 

При вычислении значения хэш-строки подготовленной строки я получил неверное/измененное значение хэш-функции.

char* fname = "fname"; 
char* lname = "lname"; 
char* fullname = new char[strlen(fname) + strlen(lname) + 1]; 
strcpy(fullname, fname); 
strcat(fullname, lname); 

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

char mdString1[33]; 

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

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

ответ

2

Вы используете указатель на указатель здесь, вместо указателя на данные:

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

Оно должно быть:

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

В первом примере это случилось потому что указатель на массив указывает на то же место в памяти, что и указатель на его первый элемент (depsite, имеющий разные типы). Но даже там было бы желательно удалить &.

+0

Большое спасибо, проблема решена. Но я не мог понять, почему? – user987654

+0

Потому что вы хешировали значение указателя вместо данных, на которые оно указывает. – interjay

+0

Великий человек, спасибо. – user987654

Смежные вопросы