2013-05-14 102 views
0

嘗試取一個字符混淆(新的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, length, hash); 

return hash; 

在一天結束時,我想有一個base64的散列表示。謝謝!!!

+0

向我們展示更多代碼。向我們展示SHA1的聲明,並向我們展示此函數的完整代碼。 – 2013-05-14 17:21:39

+0

是來自openssl/sha.h的SHA1嗎?另外,你可以在你聲明和設置tim,uri和SHA_DIGEST_LENGTH的地方顯示使用嗎? – 2013-05-14 17:22:40

+0

謝謝你! :) http://pastie.org/7907792 – Cmag 2013-05-14 17:24:18

回答

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); 
+0

謝謝!!!你爲什麼自由散列? – Cmag 2013-05-14 17:48:11

+0

好吧,當你完成它時,你不需要內存保持分配,所以你可以釋放它來保存一些內存。 – 2013-05-14 17:49:54

+0

優秀,現在如何生成hmacsha1? – Cmag 2013-05-15 14:54:54

0

錯字的代碼,必須是:

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

現在,要得到這個base64 :)

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確實是摘要的第一個字節。

+0

謝謝!!!現在如何將它變成base64? :) – Cmag 2013-05-14 17:47:34

+0

另外,你確定你想要'sizeof'而不是'strlen'嗎? – cebarth 2013-05-14 17:48:28

+1

請參閱[此問題](http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c)以查看如何轉換爲base64 – cebarth 2013-05-14 17:49:46