iOS base64编码返回与php不同的结果

时间:2012-10-11 15:05:57

标签: php ios base64 restkit

我正在构建一个使用我们自己的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编码,结果就不一样了。

1 个答案:

答案 0 :(得分:1)

你的iOS是正确的。

PHP one是字符串 3ae3bbed508b62aa9bd8e92e357e1467e888cd3da1ad5aa27692db235415eb0d base-64编码。即,这里编码的比特流是那些ASCII字符。因此,第一个30x33a0x61等等。因此,您实际上正在编码0x3361...。这有意义吗?

对于你想要的PHP:

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

告诉hash_hmac返回原始输出而不是十六进制字符串。