Как base64 кодировать строку SHA1 () в программе на C - PullRequest
1 голос
/ 22 декабря 2011

Я хочу проверить пароли в C-программе. Пароли хранятся с использованием функции sha1_base64() Perl http://metacpan.org/pod/Digest::SHA1

Я пытаюсь использовать openssl/sha.h и b64.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 ]

4 голосов
/ 22 декабря 2011

В вашем коде у вас есть

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 голосов
/ 23 декабря 2011

Хорошо, это, кажется, работает нормально ... Я просто 0 заполняю строки http://pastebin.com/LCvghszK

Можете ли вы предложить, если я могу оптимизировать функцию base64_encode.Маллок и фри выглядят довольно грязно

0 голосов
/ 22 декабря 2011

Не используйте strlen(obuf), если у вас есть статический буфер из 20 символов (160 бит), который может содержать любые двоичные данные.strlen не будет правильным: если у вас есть восемь выровненных бит до 0, он сломается, и если ни один байт в вашем буфере не равен нулю, поведение будет неопределенным.Вместо этого используйте sizeof(obuf).

...