尝试使用字符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表示。感谢!!!
答案 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:)