我正在尝试计算C中给定字符串的SHA1值。我通过#include <openssl/sha.h>
使用OpenSSL库。该计划的相关部分如下。
但它不应该引起任何问题。
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版本的问题。
答案 0 :(得分:4)
sizeof(sha1string)
与sizeof(unsigned char*)
相同,即数据指针的大小。你想在那里传递字符串的长度,使用strlen
代替sizeof
,否则你不会散列你认为你正在散列的内容。
如果tempString
不是以空字符结尾的字符串而是任意数据,则需要将数据的长度传递给checkHash
,在这种情况下,无法从内部告知长度那个功能。