簡體   English   中英

iOS base64編碼返回的結果與php不同

[英]iOS base64 encoding returning different result than php

我正在構建一個利用我們自己的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哈希時,它們包含相同的字符,但是一旦對base64進行編碼,結果將不相同。

您的iOS是正確的。

PHP一個是字符串 base 3編碼的字符串 3ae3bbed508b62aa9bd8e92e357e1467e888cd3da1ad5aa27692db235415eb0d 即,此處編碼的位流是那些ASCII字符。 因此,前30x33a0x610x3361... 。所以實際上是在編碼0x3361... 那有意義嗎?

對於您想要的PHP:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM