2011-12-22 80 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