2013-05-14 2 views
0

Пытается принять характер arracy (новый для C) и закодировать его в SHA1.C SHA1 hash не работает

Следующий бит кода не работает. Как его возвращение «\ 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 и покажите нам полный код этой функции. –

+0

Является ли SHA1 от openssl/sha.h? Кроме того, можете ли вы показывать, где вы объявляете и устанавливаете tim, uri и SHA_DIGEST_LENGTH? –

+0

СПАСИБО! :) http://pastie.org/7907792 – Cmag

ответ

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

+0

Ну, когда вы закончите с этим, вам не нужно, чтобы память оставалась выделенной, поэтому вы освободите ее, чтобы сохранить некоторую ОЗУ. –

+0

отлично, теперь как можно генерировать hmacsha1? – Cmag

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

+0

Кроме того, вы уверены, что хотите использовать 'sizeof', а не' strlen'? – cebarth

+1

См. [Этот вопрос] (http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c), чтобы узнать, как преобразовать в base64 – cebarth

Смежные вопросы