ios-hmacsha256+base64格式密钥

项目涉及到的算法,现在网上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;

}

记录,分享~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章