2

皆さん、以下の 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;
}

上記のキーはもちろん変更されていますが、正しい文字形式に保たれています

4

1 に答える 1

5

この行は正しくありません:

char *base64output = base64(result, strlen(result));

エンコードしているデータ (sha1 からの出力) にはNULバイトが含まれている可能性があります。これは、strlen が小さすぎる数値を返すことを意味します (確率1 - (255/256)^20は約7.5%です)。呼び出すのではなくstrlen、サイズを定数として渡すだけです。sha1 ハッシュをエンコードするだけの場合、長さは常に 20 になると思います。

char *base64output = base64(result, 20);

おそらく、HMAC 関数などからその長さを取得するより良い方法があります (ハッシュ アルゴリズムを変更した場合に自動的に更新されるようにするため)。

于 2013-05-22T19:54:55.443 に答える