同样的输入条件,同样的加密算法,理论上来说,应该可以产生完全一致的输出,但是 Objective-C 的输出始终是错的。
Python 代码:
payload['sig'] = base64.b64encode(hmac.new(bf3api_key, payload['data'], hashlib.sha256).digest(), '-_')
Objective-C 代码:
dataString = [[[[[data JSONRepresentation] dataUsingEncoding:NSUTF8StringEncoding] base64Encoding] stringByReplacingOccurrencesOfString:@"+" withString:@"-"] stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
NSMutableDictionary * payload = [[NSMutableDictionary alloc] initWithCapacity:2];
[payload setObject:dataString forKey:@"data"];
const char * cKey = [BF3API_KEY cStringUsingEncoding:NSASCIIStringEncoding];
const char * cData = [dataString cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData * HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString * hash = [HMAC base64Encoding];
hash = [hash stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
hash = [hash stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
[payload setObject:hash forKey:@"sig"];
输入是 data 和 key,目的是输出 sig。这些条件在两个版本的代码里是一样,用的也是同样的加密算法 SHA256,但是 Objective-C 出来就是错的。
因为最后 sig 会作为 post 参数提交到服务上进行验证,而 Python 生成的 sig 是可以过的,也就是正确的。但是 Objective-C 用 CommonCrypto 生成的 sig 就没法过了。
实在不明白为什么,所以请教这里的众多高手了。谢谢。
Python 代码:
payload['sig'] = base64.b64encode(hmac.new(bf3api_key, payload['data'], hashlib.sha256).digest(), '-_')
Objective-C 代码:
dataString = [[[[[data JSONRepresentation] dataUsingEncoding:NSUTF8StringEncoding] base64Encoding] stringByReplacingOccurrencesOfString:@"+" withString:@"-"] stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
NSMutableDictionary * payload = [[NSMutableDictionary alloc] initWithCapacity:2];
[payload setObject:dataString forKey:@"data"];
const char * cKey = [BF3API_KEY cStringUsingEncoding:NSASCIIStringEncoding];
const char * cData = [dataString cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData * HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString * hash = [HMAC base64Encoding];
hash = [hash stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
hash = [hash stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
[payload setObject:hash forKey:@"sig"];
输入是 data 和 key,目的是输出 sig。这些条件在两个版本的代码里是一样,用的也是同样的加密算法 SHA256,但是 Objective-C 出来就是错的。
因为最后 sig 会作为 post 参数提交到服务上进行验证,而 Python 生成的 sig 是可以过的,也就是正确的。但是 Objective-C 用 CommonCrypto 生成的 sig 就没法过了。
实在不明白为什么,所以请教这里的众多高手了。谢谢。