iPhone アプリに HMAC MD5 を実装する必要があります。アルゴリズムの PHP バージョン (検証用に実装されたサーバー側) はここにあり、変更できません (これは API です)。
function hmac($key, $data) {
$b = 64; // byte length for md5
if (strlen($key) > $b) {
$key = pack("H*",md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad('', $b, chr(0x36));
$opad = str_pad('', $b, chr(0x5c));
$k_ipad = $key ^ $ipad ;
$k_opad = $key ^ $opad;
$message = $k_opad . pack("H*",md5($k_ipad . $data));
return base64_encode(md5($message));
}
Objective-C の実装をいくつか見つけました。
- (NSString *)HMACMD5WithKey:(NSString *)key andData:(NSString *)data
{
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_MD5_DIGEST_LENGTH];
CCHmac(kCCHmacAlgMD5, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *hash = [Base64 encode:HMAC];
return hash;
}
同じ結果が返されませんでした (PHP != ObjC)。
ダイジェストの長さを 32 (結果は PHP の実装と同じ長さ) に変更し、キーの長さを 64 (最初の str_pad に対応) に変更して ObjC 実装を試してみましたが、結果は常に異なります。
誰かがObjective-Cで同じ結果を得る方法を教えてもらえますか??
編集: ObjC の 2 つの実装は同じ結果を返すため、ここでは 1 つだけが役に立ちます..