iOS 接口加密方法-ASE256和数字签名

//这是需要加密的字典,里面存储这需要上传的参数

NSMutableDictionary *bodyDict=[[NSMutableDictionary alloc] init];

[bodyDict setValue:@"80088202220"  forKey:@"phone"];

//这是需要配置的key,需要前后端统一配置

#define StrApiKey @"ios-to-panda"

#define StrSecretKey @"Z4Q5eE}{9Wk8h-P]j3D~$IH8Qo)~)L,c"

#define EncryptKey @"UfbFJ?}2G=WlAu}z`ilz'_^Tf8(&3(yg"

1,接口加密首先需要加时间戳

    bodyDict = [self signature:bodyDict strApiKey:StrApiKeystrSecretKey:StrSecretKey];

//数字签名

-(NSMutableDictionary*)signature:(NSMutableDictionary*)bodyDict strApiKey:(NSString*)strApiKey strSecretKey:(NSString*)strSecretKey{

    //时间戳

    NSString*time  = [NSStringstringWithFormat:@"%ld",[selfgetTimeSp]];

    [bodyDictsetObject:[NSStringgenmd5:time]forKey:@"nonce"];

    [bodyDictsetObject:timeforKey:@"time_stamp"];

    //升序排序

    NSArray*keyArray = [bodyDictallKeys];

    // 利用block进行排序

    NSArray*sortkeyArray = [keyArraysortedArrayUsingComparator:^NSComparisonResult(id  _Nonnullobj1,id  _Nonnullobj2) {

        NSComparisonResultresult = [obj1compare:obj2];

        returnresult;

    }];

    inti=0;

    NSString*strBaseString =@"";

    //生成Base String

    for(NSString* paraminsortkeyArray) {

        NSString*key;

        if([UserShareMgrisUserString:paramCompare:@"city_name"]) {//如果其中有中文需要转码

            key =  [[DataRequestshareInstance]urlEncode:[bodyDictobjectForKey:[NSStringstringWithFormat:@"%@",param]]];

        }else{

            key =  [bodyDictobjectForKey:[NSStringstringWithFormat:@"%@",param]];

        }

        if(0==i) {

            strBaseString = [NSStringstringWithFormat:@"%@=%@",param,key];

            i++;

        }else{

            strBaseString = [NSStringstringWithFormat:@"%@&%@=%@",strBaseString,param,key];

        }

    }

    //生成签名

    NSString*sign = [selfhmacSha1:strBaseString :strSecretKey];

    [bodyDictsetObject:signforKey:@"sign"];

    returnbodyDict;

}

//hmacsga1加密

- (NSString*)hmacSha1:(NSString*)public_key :(NSString*)private_key{


    NSData* secretData = [private_key dataUsingEncoding:NSUTF8StringEncoding];

    NSData* stringData = [public_key dataUsingEncoding:NSUTF8StringEncoding];


    constvoid* keyBytes = [secretDatabytes];

    constvoid* dataBytes = [stringDatabytes];


    ///#define CC_SHA1_DIGEST_LENGTH  20          /* digest length in bytes */

    void* outs = malloc(CC_SHA1_DIGEST_LENGTH);


    CCHmac(kCCHmacAlgSHA1, keyBytes, [secretDatalength], dataBytes, [stringDatalength], outs);


    // Soluion 1

    NSData* signatureData = [NSData dataWithBytesNoCopy:outs length:CC_SHA1_DIGEST_LENGTH freeWhenDone:YES];

    NSString *body = [signatureData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

    returnbody;


}

//获得当前时间戳

-(long)getTimeSp{

    longtime;

    NSDate*fromdate=[NSDatedate];

    time=(long)[fromdatetimeIntervalSince1970];

    returntime;

}

//md5加密方法,直接引用三方库的更好

+ (NSString*)genmd5:(NSString*)str

{

constchar*cStr = [strUTF8String];

unsignedcharresult[16];

CC_MD5( cStr,strlen(cStr), result );

return [NSString stringWithFormat:

@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",

result[0], result[1], result[2], result[3], 

result[4], result[5], result[6], result[7],

result[8], result[9], result[10], result[11],

result[12], result[13], result[14], result[15]];

}

2,进行ase256加密

//将数字签名后的字典转换成data

    NSError*parseError =nil;

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:bodyDict options:NSJSONWritingPrettyPrinted error:&parseError];

//将data转成字符串

    NSString *bodyString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

//将字符串转成data,至于这里为什么转2次,是因为不转码的话 php解析不了

    NSData *dataTake = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

    //进行ase256加密

    dataTake = [self AES256Encrypt:dataTake WithKey:EncryptKey];

//将data转换成字符串

    NSString *body = [dataTake base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

//AES256加密

- (NSData*)AES256Encrypt:(NSData*)Data WithKey:(NSString*)key  //加密

{

    CCCryptorRefcryptor =NULL;

    CCCryptorStatusstatus =kCCSuccess;

    idiv =nil;

    NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);

    NSParameterAssert(iv ==nil|| [iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);

    NSMutableData* keyData, * ivData;

    keyData = [(NSMutableData *)[self SHA256Hash:[key dataUsingEncoding:NSUTF8StringEncoding]] mutableCopy];

    if( [ivisKindOfClass: [NSStringclass]] )

        ivData = [[ivdataUsingEncoding: NSUTF8StringEncoding] mutableCopy];

    else

        ivData = (NSMutableData*) [ivmutableCopy]; // data or nil

    // ensure correct lengths for key and iv data, based on algorithms

    NSUIntegerkeyLength = [keyDatalength];

    if( keyLength <16){

        [keyDatasetLength:16];

    }elseif( keyLength <24){

        [keyDatasetLength:24];

    }else{

        [keyDatasetLength:32];

    }

    [ivDatasetLength: [keyDatalength]];

    status =CCCryptorCreate( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,

                             [keyDatabytes], [keyDatalength], [ivDatabytes],

                             &cryptor );


    if( status ==kCCSuccess)

    {

        NSData* result = [self_runData:(NSData*)DataCryptor: cryptorresult: &status];

        CCCryptorRelease( cryptor );

        returnresult;

    }

    return nil;

}

- (NSData*) SHA256Hash:(NSData*)data

{

    unsigned char hash[CC_SHA256_DIGEST_LENGTH];

    (void)CC_SHA256( [databytes], (CC_LONG)[datalength], hash );

    return ( [NSData dataWithBytes: hash length: CC_SHA256_DIGEST_LENGTH] );

}

- (NSData*) _runData:(NSData*)keyData Cryptor: (CCCryptorRef) cryptor result: (CCCryptorStatus*) status

{

    size_tbufsize =CCCryptorGetOutputLength( cryptor, (size_t)[keyDatalength],true);

    void* buf =malloc( bufsize );

    size_tbufused =0;

    size_tbytesTotal =0;

    *status =CCCryptorUpdate( cryptor, [keyDatabytes], (size_t)[keyDatalength],

                              buf, bufsize, &bufused );

    if( *status !=kCCSuccess)

    {

        free( buf );

        return(nil);

    }


    bytesTotal += bufused;

    // From Brent Royal-Gordon (Twitter: architechies):

    //  Need to update buf ptr past used bytes when calling CCCryptorFinal()

    *status =CCCryptorFinal( cryptor, buf + bufused, bufsize - bufused, &bufused );

    if( *status !=kCCSuccess)

    {

        free( buf );

        return(nil);

    }


    bytesTotal += bufused;


    return( [NSDatadataWithBytesNoCopy: buflength: bytesTotal] );

}

3,这样就可以使用afn进行上传了

    NSMutableDictionary *paramDict=[[NSMutableDictionary alloc] init];

    [paramDictsetValue:bodyforKey:@"data"];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351