1

iPhoneでリクエスト用の署名をいじっています。受信した JSON データをヘッダーの署名に対して検証する単純な PHP スクリプトを実行しています (全体として、2 脚の OAuth に非常に似ています)。

次の Obj-C コードは署名を生成します。

const char *cKey = [kConsumerSecret cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [payload cStringUsingEncoding:NSUTF8StringEncoding];

NSLog(@"Payload: %s", cData);

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 *signature = [hmac base64EncodedString];

検証用の PHP コードは次のようになります。

$originalPayload = '{"name":"Ben’s iPhone"}'; // The message received from iOS
$hash = hash_hmac("sha256", $originalPayload, "Secret Key", TRUE);
$signature = strtr(base64_encode($hash), array('=' => '', '+' => '-', '/' => '_'));

ASCII 文字を使用する場合、関数は完全に正常に動作します。ただし、UTF-8 文字が含まれている場合、iOS は以下に基づいて署名を計算します。

Ben’s iPhone

PHP は以下に基づいて計算します。

Ben\u2019s iPhone

署名を無効にする。私は複数のアプローチを試しましたが、どれも結果をもたらしませんでした。この問題を解決する方法を知っている人はいますか?

備考: はい、単純に OAuth を使用することもできますが、自分で実装する方法に興味があります。

更新: PHP コードで解析された JSON 配列を変更するコードの一部に問題を突き止めました。ハッシュするが本文には含めないようにするために、UTC タイムスタンプを含む一時インデックス「time」を追加しました。元の配列の変更により、PHP は文字表現を変更しました (UTF-8 文字のエスケープ)。タイムスタンプを追加するだけで問題なく動作します。

それにもかかわらず、関数は同じ結果をもたらすはずですよね?

4

0 に答える 0