2011-12-22 85 views
1

我想驗證C程序中的密碼。密碼使用sha1_base64() Perl函數http://metacpan.org/pod/Digest::SHA1如何在C程序中base64編碼SHA1()字符串

存儲我試圖使用openssl/sha.hb64.c但密碼不匹配。

我的C程序在這裏http://pastebin.com/CPC1vYAK

C代碼輸出:

[[email protected] c]$ ./sha1 password 
W6ph5Mm5Pz8GgiULbPgzG37mj9j0z8Q= 

而且Perl代碼:

[[email protected] c]$ perl -MDigest::SHA -le 'print Digest::SHA::sha1_base64("password")' 
W6ph5Mm5Pz8GgiULbPgzG37mj9g 
+0

請在這裏直接在你的問題中直接插入源代碼的相關部分。 – Mat 2011-12-22 15:05:42

回答

4

在你的代碼有

SHA1(argv[1], strlen(argv[1]), obuf); 
base64_encode(obuf,strlen(obuf),b64,100); 

strlen(obuf)是錯誤的,因爲obuf包含原始二進制數據,它沒有空終止符,所以它會報告錯誤的長度爲base64_encode

因爲SHA-1產生的20個字節的摘要(大如爲obuf),你必須傳遞給base64_encode這個尺寸:

base64_encode(obuf,20,b64,100); 
/* or (may be better if you later decide to change hashing algorithm) */ 
base64_encode(obuf,sizeof(obuf),b64,100); 
+0

好吧,這似乎工作正常..我只是0填充字符串 http://pastebin.com/LCvghszK – Ram 2011-12-23 06:17:55

+1

@Ram:這仍然是一個愚蠢的想法。處理二進制數據時,請避免使用'strlen' ***。你已經知道它有20個字節長,我甚至提供了2個你可以做的修正的例子。 – 2011-12-23 13:17:04

0

不要使用strlen(obuf)當你有一個靜態20個字符(160位)的緩衝區,可容納任何二進制數據。 strlen將是不正確的:如果你有八個對齊的位爲0,它將會中斷,如果你的緩衝區中沒有字節爲零,行爲將是未定義的。改爲使用sizeof(obuf)

-1

確定這似乎做工精細..我只是0填充字符串 http://pastebin.com/LCvghszK

您能否請建議,如果我可以優化BASE64_ENCODE功能。 malloc和free的外觀很雜亂

+0

1.這應該是對原始問題的編輯,而不是一個答案,甚至是一個全新的問題; 2.你應該擺脫那個'strlen',而不是增加解決方法。 – 2011-12-23 13:18:14