項目涉及到的算法,現在網上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;
}
記錄,分享~~~