[英]C base64 encode string
鄉親,嘗試解決以下base64函數的問題。 通過此過程的請求中約有2-3%返回不正確(太短)的base64輸出。
static const char *header_request_gce(request_rec *r, char *a)
{
char *tim = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
apr_rfc822_date(tim, r->request_time);
char *uri = apr_psprintf(r->pool, "%s", r->uri);
char encode[32768];
//encode = malloc(strlen(tim)+strlen(uri)); /* make space for the new string (should check the return value ...) */
strcpy(encode, "GET\n\n\n");
strcat(encode, tim);
strcat(encode, "\n");
strcat(encode, uri);
unsigned int encode_length = strlen(encode);
unsigned char* result;
unsigned char* key = (unsigned char*) "2kcXHh+K+XLtI61/KIV3d1tVzOooTdeOqFii9osz";
static char res_hexstring[8192];
result = HMAC(EVP_sha1(), key, 40, encode, encode_length, NULL, NULL);
char *base64(const unsigned char *input, int length);
char *base64output = base64(result, strlen(result));
return base64output;
}
char *base64(const unsigned char *input, int length)
{
BIO *bmem, *b64;
BUF_MEM *bptr;
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem);
BIO_write(b64, input, length);
BIO_flush(b64);
BIO_get_mem_ptr(b64, &bptr);
char *buff = (char *)malloc(bptr->length);
memcpy(buff, bptr->data, bptr->length-1);
buff[bptr->length-1] = 0;
BIO_free_all(b64);
return buff;
}
上面的鍵已被修改,但保持正確的字符格式
這行是不正確的:
char *base64output = base64(result, strlen(result));
您正在編碼的數據(sha1的輸出)可以包含NUL
字節,這意味着strlen返回的數字太小(概率為1 - (255/256)^20
,大約為7.5%
)。 而不是調用strlen
您應該僅將大小作為常量傳遞。 我相信,如果您只是編碼sha1哈希,則長度將始終為20:
char *base64output = base64(result, 20);
從HMAC函數或其他方法獲取該長度可能是更好的方法(以便在您更改哈希算法時自動更新),但是,我承認,我對所使用的哈希函數不太熟悉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.