C SHA1哈希不工作

C SHA1哈希不工作,c,sha1,C,Sha1,尝试获取字符数组(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, leng

尝试获取字符数组(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表示。谢谢

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

/* 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);

代码中的输入错误必须是:

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

现在,为了将其引入base64:)

我同意
返回散列是有问题的,因为您的数组是本地声明的,因此位于堆栈上,并且在函数返回后不可靠。它可能会起作用,但不要指望它

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确实是摘要的第一个字节

给我们看更多的代码。向我们展示SHA1的声明,并向我们展示此函数的完整代码。SHA1是否来自openssl/sha.h?另外,您能展示一下在哪里声明和设置tim、uri和SHA_摘要长度吗?谢谢大家!)散列返回是不安全的,因为它的作用域将被限制在声明它的函数中。要么通过malloc/calloc分配哈希值,要么将其传递到函数中。@但不确定如何通过malloc分配哈希值……另外,您确定要在那里使用
sizeof
,而不是
strlen
?请参阅以了解如何转换为base64。好的,当您使用完它后,您不需要继续分配内存,所以你可以释放它来节省一些内存。