2013-12-08 50 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