objective-c实现authCode 解决php与ios通信加密的问题

WBOY
Freigeben: 2016-06-20 12:25:52
Original
1070 Leute haben es durchsucht

最近项目中要加密与服务器的通讯内容,主要是为了防止恶意的抓包利用,本来这样的加密直接在网上就可以找到的,但是无奈关于OC的几乎都来自同一个模版,加密出来的字符窜无法被PHP后端解析,并且也没有有效时间的参数,所以只能对照PHP的加密代码写一个OC版的,其中PHP的很多方法,在OC当中远远没有一句话那么简单(::>_<::>


#import <CommonCrypto/CommonDigest.h>#define STRING_SPLICE(a,b)     ([NSString stringWithFormat:@"%@%@",(NSString *)(a),(NSString *)(b)])//字符串拼接
Nach dem Login kopieren
+ (NSString *)md5:(NSString *)str {    const char *cStr = [str UTF8String];    unsigned char result[16];    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call        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]            ];}
Nach dem Login kopieren
// param: 要加密的字符串// operation: 传入@"ENCODE" 为加密,解密没有写,所以只要不传"DECODE"就OK了// expiry: 有效时间,单位是秒,默认时0,就是没有时效,如果设置后超出有效时间,将无法被解密+ (NSString *)encryption:(NSString *)param operation:(NSString *)operation expiry:(int)expiry{    NSString *key = @"1992326qa";   // 加密的密钥    NSString *DECODE = @"DECODE";    param = [param stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    operation = operation ? operation : DECODE;    expiry = expiry ? expiry : 0;    int keyLength = 4;    key = [self md5:key];    NSString *keya = [self md5:[key substringToIndex:16]];    NSString *keyb = [self md5:[key substringFromIndex:16]];    NSString *time = [self microtime];    NSString *keyc = keyLength ? ([operation isEqualToString:DECODE] ? [param substringToIndex:keyLength] : [[self md5:time] substringFromIndex:[self md5:time].length - keyLength]) : @"";    NSString *cryptkey = STRING_SPLICE(keya, [self md5:STRING_SPLICE(keya, keyc)]);    keyLength = cryptkey.length;    param = [NSString stringWithFormat:@"%@%@%@",([NSString stringWithFormat:@"%010d",expiry ? expiry + (int)[[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970] : expiry]),[[self md5: STRING_SPLICE(param,keyb)] substringToIndex:16],param];    int paramLength = param.length;    NSString *result = @"";    NSMutableArray *box = [NSMutableArray arrayWithCapacity:UnicodeCount];    for (int i = 0; i <= UnicodeCount; i++) {        [box addObject:@(i)];    }    NSMutableArray *rndkey = [NSMutableArray array];    for (int i = 0; i <= UnicodeCount; i++) {        const char rndkeyItem = [cryptkey characterAtIndex:i % keyLength];        NSString *asciiStr = [NSString stringWithCString:&rndkeyItem encoding:NSASCIIStringEncoding];        int asciiCode = [asciiStr characterAtIndex:0];        [rndkey addObject:@(asciiCode)];    }    for (int i=0,j = 0; i <= UnicodeCount; i++) {        j = (j + [box[i] intValue] + [rndkey[i] intValue]) % (UnicodeCount + 1);        int tmp = [box[i] intValue];        box[i] = box[j];        box[j] = @(tmp);    }    for (int a = 0,j = 0,i = 0; i < paramLength; i ++) {        a = (a + 1) % (UnicodeCount + 1);        j = (j + [box[a] intValue]) % (UnicodeCount + 1);        int tmp = [box[a] intValue];        box[a] = box[j];        box[j] = @(tmp);        int s1 = [self ord:param index:i];        int s2 = [box[([box[a] intValue] + [box[j] intValue]) % (UnicodeCount + 1)] intValue];        int s3 = s1 ^ s2;        NSString *add = [self strChr:s3];        result = STRING_SPLICE(result, add);    }    return [NSString stringWithFormat:@"%@%@",keyc,[[self base64:result] stringByReplacingOccurrencesOfString:@"=" withString:@""]];}
Nach dem Login kopieren
+ (NSString *)microtime // 计算时间串{    NSDate *currentDate = [NSDate dateWithTimeIntervalSinceNow:0];    NSTimeInterval interval = [currentDate timeIntervalSince1970];    NSString *intervalStr = [NSString stringWithFormat:@"%f00",interval];    NSString *pre = [intervalStr substringWithRange:NSMakeRange(intervalStr.length - 8, 8)];    NSString *suf = [intervalStr substringToIndex:intervalStr.length - 9];    NSString *result = [NSString stringWithFormat:@"0.%@ %@",pre,suf];    return result;}
Nach dem Login kopieren
+ (int)ord:(NSString *)str index:(int)index  // 获取字符串某一位的ASCII码{    int asciiCode = [str characterAtIndex:index];    return asciiCode;}
Nach dem Login kopieren
+ (const char)chr:(int)asciiCode  // 通过ASCII码获取字符{    return [[NSString stringWithFormat:@"%C",(unichar)asciiCode] characterAtIndex:0];}
Nach dem Login kopieren
+ (NSString *)strChr:(int)asciiCode // 通过ASCII码获取字符串{    NSString *data = [NSString stringWithFormat:@"%C",(unichar)asciiCode]; //A    return data;}
Nach dem Login kopieren
+ (NSString *)base64:(NSString *)str // base64编码{    NSString *base64EncodedString = [[str dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];    return base64EncodedString;}
Nach dem Login kopieren

注意:

  • 只有加密算法(因为我不需要解密)
  • 如果需要加密汉字,加密过程中,会出现空格字符,而后端会解析失败,所以在后台解析iOS端时,要将加密串中的空格替换为+号,才能保证每次解析成功

问题:

  • 因为加密过程中需要转换ASCII码,但是Mac和Window的ASCII码在127位以后就不一样了,所以我们只能利用前127位ASCII码

我也是先留着,搞不好什么时候又用到了~

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage