2

それで、最終的に hmac sha 256 ハッシュを行う方法を見つけました。これを、私が作成した wcf サービス API に使用します。私の問題は、私のメソッドが送信している NSData 出力にスペースがあることです。

例えば。これは、私のAPIが送信するもののように見える方法です

"2efb00aba01a3f5b674fba3063b43fee7a9356947118......"

そして、これは私のiPhoneアプリがそれを示す方法です

<2efb00ab a01a3f5b 674fba30.....>

これは、目的の c の私のコードがどのように見えるかです。

NSData *hmacSHA256(NSString *key, NSString *data)
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    return [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
}

これはこの答えから来ました:

https://stackoverflow.com/a/8459123/639713

とにかく、私の問題は、これにどう対処するかです。NSdata 出力を文字列に変換するにはどうすればよいですか? 文字列に変換された場合、出力は WCF サービス API が送信するものとは異なると思います。API が hmacsha256 出力を処理する方法を変更しますか?

ありがとう!

4

2 に答える 2

6

メソッドを少し変更して、ダイジェスト バイトを含む NSData を作成する代わりに、バイトを 16 進数としてフォーマットする文字列を作成できます。

NSString *hmacSHA256(NSString *key, NSString *data)
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSMutableString *result = [NSMutableString string];
    for (int i = 0; i < sizeof cHMAC, i++)
    {
        [result appendFormat:@"%02hhx", cHMAC[i]];
    }

    return result;
}
于 2013-01-26T04:02:37.243 に答える
1

<2efb00ab a01a3f5b 674fba30.....>を呼び出した結果のように見えます。これは、フォーマット文字列の場合-[NSData description]と同様です。自体は一連のバイトを表します。求めている出力は、16 進文字列としてのバイト シーケンスのようです。その形式にシリアル化する方法については、NSData を 16 進数文字列にシリアル化する最良の方法を参照してください。NSLog%@NSDataNSData

于 2013-01-26T04:01:37.793 に答える