C SHA1哈希不工作
尝试获取字符数组(C中新增)并在SHA1中对其进行编码 以下代码位不工作。作为其返回“\x10”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
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。好的,当您使用完它后,您不需要继续分配内存,所以你可以释放它来节省一些内存。