项目涉及到的算法,现在网上hamcsha256的都有,我要记录的是其中一种特殊情况
特殊情况:你拿到密钥key值为base64之后的,且该key值无法正常base64解码出来,你需要在hamc算法了解码之后,再调用CCHmac算法。
下面是通常意义上的算法,这种算法如果secret值能够正常base64解码出来是没有问题,但是一旦遇到不能正常base64解码的,算出结果将和安卓端、后台端不同。
-(NSString*)hmacSHA256WithSecret:(NSString*)secret content:(NSString*)content{
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:secret options:0];
const char*cKey = [decodedData bytes];
const char *cData = [content cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData,strlen(cData), cHMAC);
NSData*HMACData = [NSDatadataWithBytes:cHMAClength:sizeof(cHMAC)];
//2、对二进制数据进行base64编码,完成后返回字符串
NSString *sssaa = [HMACData base64EncodedStringWithOptions:0];
NSLog(@"--->%@",sssaa);
returnsssaa;
}
下面👇是调整后的代码,调整很简单,只是将 strlen(cKey)换成了decodedData.length
原因在于, strlen(cKey)的值比decodedData.length的值多1。
-(NSString*)hmacSHA256WithSecret:(NSString*)secret content:(NSString*)content{
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:secret options:0];
const unsigned char*cKey = [decodedData bytes];
const char *cData = [content cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, decodedData.length, cData,strlen(cData), cHMAC);
NSData*HMACData = [NSDatadataWithBytes:cHMAClength:sizeof(cHMAC)];
//2、对二进制数据进行base64编码,完成后返回字符串
NSString *baseHamcstr = [HMACData base64EncodedStringWithOptions:0];
NSLog(@"--->%@",baseHamcstr);
return baseHamcstr;
}
记录,分享~~~
网友评论