Я пытаюсь создать подпись base64 для запроса на отдых, используя алгоритм HMAC-SHA1. Я специально использую API-интерфейс SinglePlatform, и следующие шаги:
- Удалите доменную часть запроса, оставив только путь и запрос: / location / haru-7? Client = YOUR_CLIENT_ID
- Получите свой закрытый ключ, который закодирован в модифицированном Base64 для URL-адресов, и подпишите указанный выше URL-адрес с помощью алгоритма HMAC-SHA1. Возможно, вам потребуется декодировать ключ подписи в исходный двоичный формат. Во многих криптографических библиотеках результирующая подпись будет в двоичном формате.
- Закодируйте полученную двоичную подпись с помощью модифицированного Base64 для URL-адресов, чтобы преобразовать эту подпись во что-то, что можно передать в URL-адресе. Прикрепите эту подпись к URL-адресу с помощью параметра sig:
Моя текущая реализация выглядит следующим образом:
// Convert a modified Base64 key into Base64
NSString *modifiedKey = [SIGNING_KEY stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
modifiedKey = [modifiedKey stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
// Decode the Base64 key
NSData *key = [NSData dataFromBase64String:modifiedKey];
// Construct a url with params
NSString *data = [NSString stringWithFormat:@"/locations/%@?client=%@", _id, CLIENT_ID];
// Convert key and data to c chars
const char *keyBytes = [key bytes];
const char *baseStringBytes = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char digestBytes[CC_SHA1_DIGEST_LENGTH];
CCHmacContext ctx;
CCHmacInit(&ctx, kCCHmacAlgSHA1, keyBytes, strlen(keyBytes));
CCHmacUpdate(&ctx, baseStringBytes, strlen(baseStringBytes));
CCHmacFinal(&ctx, digestBytes);
NSData *digestData = [NSData dataWithBytes:digestBytes length:CC_SHA1_DIGEST_LENGTH];
// Reconvert the into Base64 modified
NSString *signingKey = [digestData base64EncodedString];
signingKey = [signingKey stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
signingKey = [signingKey stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
if ( [data hasSuffix:@"="] ) {
[signingKey substringToIndex:[hassigningKeyh length]-1];
}
NSLog(@"Signing Key: %@", signingKey);
Первоначально полученный мной ключ подписи является модифицированным Base64, поэтому я заменяю символы - + _ /. Эта реализация вернула правильный ключ подписи, но не всегда.
Я что-то явно не так делаю, конвертируя Objective-C в C? Есть ли лучший способ справиться с этим?
Мое приложение использует ARC.