5

私たちの多くが知っているように、Apple では最近、ハッカーがアプリ内購入を無料で入手できるという状況がありました。Apple は最近、パッチの適用方法を説明したこのドキュメントをリリースしましたが、ステップ 4 で少し混乱しており、助けていただければ幸いです。

最初のステップは、パッチ .h および .m をダウンロードし、それをプロジェクトに含めて、セキュリティ フレームワークにリンクすることです。わかりました。すると、Apple は次のように述べています。

4. Provide a base64 encoder, a base64 decoder, and the action to perform when validation succeeds.

エンコーダに関する部分は、私がすべきことを正確に何を意味していますか? (検証が成功したときに実行するアクションは、私には明らかです。)確かに、クラス内にbase64_encodeandという名前の関数が表示されます。base64_decodeしかし、それは何を求めているのでしょうか? これは、ハッキングを防ぐための、私だけが知っている特別な PIN 番号のようなものですか? ここで何をすべきかわかりません。もちろん、エンコードとデコードの全体的な概念はわかりますが、この状況で適切に生成する方法のプログラムの詳細はわかりません。

これが役立つ場合、Appleが書いたコード:

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length
{ 
#warning Replace this method.
    return nil;
}

- (NSString *)decodeBase64:(NSString *)input length:(NSInteger *)length
{
#warning Replace this method.
    return nil;
}

#warning Implement this function.
char* base64_encode(const void* buf, size_t size)
{ return NULL; }

#warning Implement this function.
void * base64_decode(const char* s, size_t * data_len)
{ return NULL; }

また、エンコード機能とデコード機能が 2 つずつあることにも困惑しています。sを返すペアがあることはわかりましたが、2 番目のペアが aと aを返すNSString*のはなぜですか? これらの関数は何を返すと予想されますか? 私は本当にそれを取得しません。 char*void*

4

2 に答える 2

0

提示された解決策をご覧ください:こちら、不明な作成者によって投稿されました。

これには、私がテストして動作する次のコードが含まれています。

//  single base64 character conversion
static int POS(char c)
{
    if (c>='A' && c<='Z') return c - 'A';
    if (c>='a' && c<='z') return c - 'a' + 26;
    if (c>='0' && c<='9') return c - '0' + 52;
    if (c == '+') return 62;
    if (c == '/') return 63;
    if (c == '=') return -1;

    [NSException raise:@"invalid BASE64 encoding" format:@"Invalid BASE64 encoding"];
    return 0;
}

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length
{
    return [NSString stringWithUTF8String:base64_encode(input, (size_t)length)];
}

- (NSString *)decodeBase64:(NSString *)input length:(NSInteger *)length
{
    size_t retLen;
    uint8_t *retStr = base64_decode([input UTF8String], &retLen);
    if (length)
        *length = (NSInteger)retLen;
    NSString *st = [[[NSString alloc] initWithBytes:retStr
                                             length:retLen
                                           encoding:NSUTF8StringEncoding] autorelease];
    free(retStr);    // If base64_decode returns dynamically allocated memory
    return st;
}

char* base64_encode(const void* buf, size_t size)
{
    static const char base64[] =  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    char* str = (char*) malloc((size+3)*4/3 + 1);

    char* p = str;
    unsigned char* q = (unsigned char*) buf;
    size_t i = 0;

    while(i < size) {
        int c = q[i++];
        c *= 256;
        if (i < size) c += q[i];
        i++;

        c *= 256;
        if (i < size) c += q[i];
        i++;

        *p++ = base64[(c & 0x00fc0000) >> 18];
        *p++ = base64[(c & 0x0003f000) >> 12];

        if (i > size + 1)
            *p++ = '=';
        else
            *p++ = base64[(c & 0x00000fc0) >> 6];

        if (i > size)
            *p++ = '=';
        else
            *p++ = base64[c & 0x0000003f];
    }

    *p = 0;

    return str;
}

void* base64_decode(const char* s, size_t* data_len_ptr)
{
    size_t len = strlen(s);

    if (len % 4)
        [NSException raise:@"Invalid input in base64_decode" format:@"%d is an invalid length for an input string for BASE64 decoding", len];

    unsigned char* data = (unsigned char*) malloc(len/4*3);

    int n[4];
    unsigned char* q = (unsigned char*) data;

    for(const char*p=s; *p; )
    {
        n[0] = POS(*p++);
        n[1] = POS(*p++);
        n[2] = POS(*p++);
        n[3] = POS(*p++);

        if (n[0]==-1 || n[1]==-1)
            [NSException raise:@"Invalid input in base64_decode" format:@"Invalid BASE64 encoding"];

        if (n[2]==-1 && n[3]!=-1)
            [NSException raise:@"Invalid input in base64_decode" format:@"Invalid BASE64 encoding"];

        q[0] = (n[0] << 2) + (n[1] >> 4);
        if (n[2] != -1) q[1] = ((n[1] & 15) << 4) + (n[2] >> 2);
        if (n[3] != -1) q[2] = ((n[2] & 3) << 6) + n[3];
        q += 3;
    }

    // make sure that data_len_ptr is not null
    if (!data_len_ptr)
        [NSException raise:@"Invalid input in base64_decode" format:@"Invalid destination for output string length"];

    *data_len_ptr = q-data - (n[2]==-1) - (n[3]==-1);

    return data;
}
于 2012-07-27T06:23:33.840 に答える
0

汎用の base64 エンコーダーが必要なようです。ここでいくつかのコードを試してください:

http://cocoadev.com/wiki/BaseSixtyFour

(免責事項:私はこれをテストしていません)

読みやすい 2 番目のものを次に示し ます。

于 2012-07-23T13:40:30.407 に答える