我正在尝试使用 HMAC-SHA1 算法为休息请求创建 base64 签名。我专门使用 SinglePlatform API,步骤如下:
- 去掉请求的域部分,只留下路径和查询:/locations/haru-7?client=YOUR_CLIENT_ID
- 检索您的私钥,该私钥在 URL 的修改后的 Base64 中编码,并使用 HMAC-SHA1 算法对上述 URL 进行签名。您可能需要将签名密钥解码为其原始二进制格式。在许多密码库中,生成的签名将采用二进制格式。
- 使用修改后的 Base64 for URL 对生成的二进制签名进行编码,以将此签名转换为可以在 URL 中传递的内容。使用 sig 参数将此签名附加到 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。