HMAC-SHA1 アルゴリズムを使用して、残りのリクエストの base64 署名を作成しようとしています。私は特に SinglePlatform API を使用しています。手順は次のとおりです。
- リクエストのドメイン部分を取り除き、パスとクエリのみを残します:/locations/haru-7?client=YOUR_CLIENT_ID
- URL 用に変更された Base64 でエンコードされた秘密鍵を取得し、HMAC-SHA1 アルゴリズムを使用して上記の URL に署名します。署名キーを元のバイナリ形式にデコードする必要がある場合があります。多くの暗号化ライブラリでは、結果の署名はバイナリ形式になります。
- URL 用に変更された Base64 を使用して結果のバイナリ署名をエンコードし、この署名を URL 内で渡すことができるものに変換します。sigparameter を使用して、この署名を URL に添付します。
私の現在の実装は次のとおりです。
// 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 を使用しています。