0

文字配列 (C の新機能) を取得し、SHA1 でエンコードしようとしています。

次のコードは機能していません。返される '\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 表現が必要です。ありがとう!!!

4

3 に答える 3

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 が本当にダイジェストの最初のバイトである可能性があります。

于 2013-05-14T17:44:35.580 に答える
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);
于 2013-05-14T17:33:20.097 に答える