1

独自の Web サービスを使用して iOS アプリを構築していますが、iOS 内でデータを base64 エンコードし、PHP の base64_encode() 関数を使用してエンコードされた同じデータと比較しようとすると、いくつかの問題が発生します。

iOS 側:

/*
 * Generating a hash within an NSData object, which then I try to base64 encode
 *  making use of the Base64 library included with RestKit.
 */
const char *cKey  = [private_key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [password cStringUsingEncoding:NSASCIIStringEncoding];  
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];   
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);  
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *myHash = [HMAC base64EncodedString];

PHP 側:

$hash = hash_hmac('sha256',$data,$key);
$encoded_hash = base64_encode($hash);

出力は次のようになります。

iOS HMAC: <3ae3bbed 508b62aa 9bd8e92e 357e1467 e888cd3d a1ad5aa2 7692db23 5415eb0d>
iOS myHash: OuO77VCLYqqb2OkuNX4UZ+iIzT2hrVqidpLbI1QV6w0=

PHP hash: 3ae3bbed508b62aa9bd8e92e357e1467e888cd3da1ad5aa27692db235415eb0d
PHP encoded_hash: M2FlM2JiZWQ1MDhiNjJhYTliZDhlOTJlMzU3ZTE0NjdlODg4Y2QzZGExYWQ1YWEyNzY5MmRiMjM1NDE1ZWIwZA==

ご覧のとおり、iOS の HMAC と PHP Hash を比較すると、同じ文字が含まれていますが、これを base64 でエンコードすると、結果は同じではありません。

4

1 に答える 1

1

あなたのiOSは正しいです。

PHP のものは、base-64 でエンコードされた文字列です。 3ae3bbed508b62aa9bd8e92e357e1467e888cd3da1ad5aa27692db235415eb0dつまり、ここでエンコードされるビット ストリームはこれらの ASCII 文字です。つまり、最初3は is 0x33aisなどです。つまり、実際に0x61エンコードしています。0x3361...それは理にかなっていますか?

必要な PHP の場合:

$hash = hash_hmac('sha256',$data,$key,true);
$encoded_hash = base64_encode($hash);

これはhash_hmac、16 進文字列ではなく生の出力を返すように指示します。

于 2012-10-11T15:27:40.633 に答える