C SHA1哈希不起作用

时间:2013-05-14 17:12:52

标签: c sha1

尝试使用字符arracy(C的新功能)并在SHA1中对其进行编码。

以下代码无效。因为它返回'\ x10'

char encode[1000];
strcpy(encode, "GET\n\n\n");
strcat(encode, tim);
strcat(encode, "\n");
strcat(encode, uri);

size_t length = sizeof(encode);
unsigned char hash[SHA_DIGEST_LENGTH];
SHA1(encode, length, hash);

return hash;

在一天结束时,我希望有一个hash64的base64表示。感谢!!!

3 个答案:

答案 0 :(得分:1)

最有可能的,你的问题是你返回本地声明的内存,其生命周期等于你的函数范围。它不会在该范围之外存在。您应该允许用户传入自己的缓冲区来保存哈希:

/* Requires a buffer with a size of at least SHA_DIGEST_LENGTH bytes. */
void do_hash(unsigned char* buffer) {
    /* your code */
    SHA1(encode, length, buffer);
}

使用示例:

unsigned char* hash = malloc(sizeof(unsigned char) * SHA_DIGEST_LENGTH);
do_hash(hash);

/* do whatever you want */

free(hash);

答案 1 :(得分:1)

我同意return hash是有问题的,因为你的数组是本地声明的,因此在堆栈上并且在函数返回后不可靠。 可能有效,但不要依赖它。

Openssl还有另一种可以使用的行为:

strcpy(encode, "GET\n\n\n");
strcat(encode, tim);
strcat(encode, "\n");
strcat(encode, uri);

size_t length = sizeof(encode);
return SHA1(encode, length, NULL);

这将返回SHA1“管理”的静态数组。但是,下次调用SHA1时,该数组将被覆盖。

此外,SHA1只是计算原始摘要。如果你想要base64,你需要转换它。可能是0x10确实是摘要的第一个字节。

答案 2 :(得分:0)

代码中的拼写错误,必须是:

size_t length = sizeof(encode);
unsigned char hash[length];
SHA1(encode, length, hash);

现在,要将其转换为base64:)