2013-08-25 29 views
0

当计算硬编码字符串的散列值时,我得到了一个正确的值。使用openssl/md5的意外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