0

尝试采用字符 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;

归根结底,我想要一个哈希的 base64 表示。谢谢!!!

4

3 回答 3

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);
于 2013-05-14T17:33:20.097 回答
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 确实是摘要的第一个字节。

于 2013-05-14T17:44:35.580 回答
0

代码中的错字,必须是:

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

现在,把它变成base64 :)

于 2013-05-14T17:43:37.910 回答