2013-12-08 26 views
1

我想计算C中给定字符串的SHA1值。我通过#include <openssl/sha.h>使用OpenSSL库。该计划的相关部分如下。 但它不应该导致任何问题。openssl/sha.h似乎计算错误的散列

void checkHash(char* tempString) { 
    unsigned char testHash[SHA_DIGEST_LENGTH]; 
    unsigned char* sha1String = (unsigned char*)tempString; 
    SHA1(sha1String, sizeof(sha1String), testHash); 
    printf("String: %s\nActual hash: 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8\nComputed hash: ", tempString); 
// I verified the actual hash for "a" using multiple online hash generators. 
    for (i = 0; i < SHA_DIGEST_LENGTH; i++) 
     printf("%x", testHash[i]); 
    printf("\n"); 
} 

运行程序与checkHash("a");产生以下的输出:

String: a 
Actual hash: 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 
Computed hash: 16fac7d269b6674eda4d9cafee21bb486556527c 

怎么会这些哈希值不匹配?我在一台64位Windows 7机器上运行64位Linux VM。这在过去为我造成了一些问题,但我怀疑这是使用OpenSSL版本的问题。

回答

4

sizeof(sha1string)sizeof(unsigned char*)相同,即数据指针的大小。你想在那里传递字符串的长度,使用strlen而不是sizeof,否则你不会哈希你认为你哈希的东西。

如果tempString不是以空字符结尾的字符串而是任意数据,则需要将数据长度传递给checkHash,在这种情况下,无法从该函数内判断长度。

+0

长度是问题,谢谢!尽管注意,'strlen'不会计算一个无符号的char *。所以使用该功能在这里不起作用。我只是用'1'手动传递来测试这是否是问题。 – TerekC