Цель-C: Декодировать подписанный запрос - PullRequest
0 голосов
/ 15 августа 2011

Как мне декодировать подписанный запрос в Objective-C?

Как мне перевести этот код на Ruby в Objective-C или C?

# Facebook sends a signed_requests to authenticate certain requests.
# http://developers.facebook.com/docs/authentication/signed_request/
def decode_signed_request(signed_request)
  encoded_signature, encoded_data = signed_request.split('.')
  signature = base64_url_decode(encoded_signature)
  expected_signature = OpenSSL::HMAC.digest('sha256', @secret, encoded_data)
  if signature == expected_signature
    JSON.parse base64_url_decode(encoded_data)
  end
rescue Exception => e
  puts $!, $@
end

def base64_url_decode(string)
  "#{string}==".tr("-_", "+/").unpack("m")[0]
end

SSToolKit Base64 декодирование NSString выглядит полезным.

1 Ответ

1 голос
/ 15 августа 2011

Хотите проверить подпись на данных или просто «расшифровать» их? Если это последнее, вы можете просто проигнорировать подпись:

NSString *signedData = ...;
NSString *base64EncodedData = [[signedData componentsSeparatedByString:@"."] objectAtIndex:1];
NSString *jsonString = [NSString stringWithBase64String:base64EncodedData];
id jsonObject = ...;

Я оставляю использование Facebook SDK и выбираю подходящую среду JSON (я рекомендую JSONKit ) до вас.

Ваш комментарий означает, что вы хотите проверить HMAC, включенный в сообщение. В этом случае:

unsigned int length = 0;
unsigned char *expectedHmac = HMAC(EVP_sha256(), [key bytes], [key length], [base64EncodedData UTF8String], [base64EncodedData length], NULL, &length);
NSData *expectedHmacData = [NSData dataWithBytes:expectedHmac length:length];
// compare expected hmac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...