2012-10-11 40 views
1

我建立一個iOS應用程序,利用我們自己的網絡服務,但我有一些問題,當內iOS的base64編碼數據,並試圖將其使用PHP BASE64_ENCODE編碼相同的數據進行比較( )功能。iOS的base64編碼返回不同的結果比PHP

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哈希它們包含t他是同一個字符,但是一旦你對base64進行編碼,結果就不一樣了。

回答

1

您的iOS版本是正確的。

PHP的一個是字符串3ae3bbed508b62aa9bd8e92e357e1467e888cd3da1ad5aa27692db235415eb0d base-64編碼。即這裏編碼的比特流是那些ASCII字符。所以第一30x33,該a0x61等,所以你編碼0x3361...實際。那有意義嗎?

對於PHP你想:

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

這告訴hash_hmac返回原始輸出,而不是一個十六進制字符串。

+0

謝謝馬特,我明白,但你會如何處理它,所以我可以編碼該字符串而不是ASCII字符?謝謝 –

+1

你是什麼意思?我已經展示了正確的PHP來編碼正確的東西。您將'true'作爲第四個參數傳遞給'hash_hmac',以使返回值成爲實際字節,而不是這些字節的十六進制表示。合理? – mattjgalloway

+0

哦!我錯過了PHP代碼,現在只是看到了......對不起。這絕對是有道理的,我嘗試了它,它的工作原理。謝謝! :) –

相關問題