簡體   English   中英

Facebook簽署iOS請求(HMAC SHA256)

[英]Facebook Signed Request for iOS (HMAC SHA256)

我一直在努力為iOS上的Facebook簽名請求生成HMAC SHA256幾周。 我迫切需要幫助。

Facebook簽署的請求有兩個部分,由一個句點分隔。 第一部分是有效載荷的HMAC256,而第二部分是有效載荷的Base64編碼串。 我只能重新創建第二部分。

.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0

我一直在使用以下代碼,每個人都使用它,但它生成一個不同的哈希:

#import <CommonCrypto/CommonHMAC.h>
#import "NSData+Base64.h"

+(NSString*) hmacForSecret:(NSString*)secret data:(NSString*)data {

     const char *cKey  = [secret cStringUsingEncoding:NSASCIIStringEncoding];
     const char *cData = [data 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)];

     return [HMAC base64EncodedString];
}

根據Facebook文檔: https//developers.facebook.com/docs/authentication/signed_request/

當使用“ secret ”作為密鑰時,應該正確輸入HMAC256:

 vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso

要編碼的有效負載:

 {
     "algorithm": "HMAC-SHA256",
     "0": "payload"
 }

注意:您可以Base64解碼簽名請求的第二部分以獲取此有效負載。

問題出在Base64編碼器上。 它需要編碼為Base64Url,請參閱: http//en.wikipedia.org/wiki/Base64#URL_applications

這是修改后的base64EncodedString類別方法:

//NSData+Base64.h
 - (NSString *)base64EncodedString
 {
    size_t outputLength;

    char *outputBuffer = NewBase64Encode([self bytes], [self length], true, &outputLength);
    NSString *result = [[[NSString alloc] initWithBytes:outputBuffer length:outputLength encoding:NSASCIIStringEncoding] autorelease];
    free(outputBuffer);

     NSString *b64PayloadClean = [[result componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@""];

     //do URL encoding by replacing "+" and "/" to "-" and "_" respectively
     b64PayloadClean = [b64PayloadClean stringByReplacingOccurrencesOfString:@"=" withString:@""];
     b64PayloadClean = [b64PayloadClean stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
     b64PayloadClean = [b64PayloadClean stringByReplacingOccurrencesOfString:@"/" withString:@"_"];

    return b64PayloadClean;
 }

暫無
暫無

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

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