【问题标题】:Facebook Signed Request for iOS (HMAC SHA256)适用于 iOS 的 Facebook 签名请求 (HMAC SHA256)
【发布时间】:2012-05-30 07:51:59
【问题描述】:

几周以来,我一直在尝试为 iOS 上的 Facebook 签名请求生成 HMAC SHA256。我迫切需要帮助。

Facebook 签名请求有两个部分,由句点分隔。第一部分是有效载荷的 HMAC256,而第二部分是有效载荷的 Base64 编码字符串。我只能重新创建第二部分。

vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIIjAiOiJwYXlsb2FkIn0

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

#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/

正确的 HMAC256 输出应该是使用“secret”作为密钥时:

 vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso

要编码的载荷:

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

注意:您可以对签名请求的第二部分进行 Base64 解码以获取此有效负载。

【问题讨论】:

标签: iphone objective-c ios facebook sha256


【解决方案1】:

问题出在 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;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2022-06-19
    相关资源
    最近更新 更多