我如何在C程序中base64编码SHA1()字符串

时间:2011-12-22 15:03:08

标签: c base64 sha1

我想验证C程序中的密码。使用sha1_base64() Perl函数http://metacpan.org/pod/Digest::SHA1

存储密码

我正在尝试使用openssl/sha.hb64.c,但密码不匹配。

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

C代码输出:

[ram@darkstar c]$ ./sha1  password
W6ph5Mm5Pz8GgiULbPgzG37mj9j0z8Q=

和Perl代码:

[ram@darkstar c]$ perl -MDigest::SHA -le 'print Digest::SHA::sha1_base64("password")'
W6ph5Mm5Pz8GgiULbPgzG37mj9g

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

当你有一个可以容纳任何二进制数据的20个字符(160位)的静态缓冲区时,不要使用strlen(obuf)strlen不正确:如果你有8个对齐的位为0,它将会中断,如果缓冲区中没有字节为零,则行为将是未定义的。请改用sizeof(obuf)

答案 2 :(得分:-1)

好的,这似乎工作得很好..我只是0填充字符串 http://pastebin.com/LCvghszK

你能否建议我是否可以优化base64_encode功能。 malloc和free的外观相当混乱