目前我在为给定的Google Maps Web Services API查询生成公钥时遇到问题。
该文档规定,签名必须在URL的路径和查询部分使用修改后的base-64 HMAC-SHA1哈希生成。
然而,使用该功能并使用该工具进行测试表明,它不能正常工作。
+ (NSString *) hmac:(NSString *)data withKey:(NSString *)key{
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *hash = [HMAC base64EncodedStringWithOptions:0];
hash = [hash stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
hash = [hash stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
return hash;
}
我调用这个函数时,数据已被预先编码;
[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
我哪里错了?非常感谢您的帮助。
您可以将其用于url签名:https://github.com/youssman/GMUrlSigner
我对您的反馈和意见很感兴趣;-)
Google有一个Objective C代码示例-您没有在代码中使用它们和一些Google函数有什么特别的原因吗?特别是,CKey的等价性不是普通的7位asCII(如您的示例中所编码的),而是Base64(rfc4648Base64WebsafeStringEncoding)。对于不熟悉的人来说,Base64通常在mime Mail中使用,以允许附件在几年前(在HTML Mail之前)通过纯文本电子邮件。问题是,如果谷歌认为你的密钥是Base64,而事实并非如此,解码将更改你的密钥-例如,ascii中的Base64 abcedfg=iy。。。所以谷歌没有从你的URL中获得正确的解码密钥。
还有其他的不同,但我想大多数只是格式上的不同。