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;

}

記錄,分享~~~

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