iOS开发技巧

[iOS]iOS开发HmacMD5+Key加密

2020-08-10  本文已影响0人  沵可安好

前言

最近公司要求接口请求统一要进行加密,大致方法是先将请求参数按key升序排序,拼接成串,然后用HmacMD5加密。废话不多说,直接上代码。

导入头文件

#import <CommonCrypto/CommonDigest.h>

参数按key升序排列

+(NSString *)sortByASCII:(NSDictionary*)dict{
    NSArray*allKeyArray = [dict allKeys];
    NSArray*afterSortKeyArray = [allKeyArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1,id _Nonnull obj2) {
        NSComparisonResult resuest = [obj1 compare:obj2];
        return resuest;
    }];
    //通过排列的key值获取value
    NSMutableArray *valueArray = [NSMutableArray array];
    for(NSString * sortsing in afterSortKeyArray) {
        NSString * valueString = [dict objectForKey:sortsing];
        [valueArray addObject:valueString];
    }
    NSMutableString *signString = [NSMutableString string];
    for(int i =0; i < afterSortKeyArray.count; i++) {
        if (i==0) {
             NSString * keyValue = [NSString stringWithFormat:@"%@=%@",afterSortKeyArray[i],valueArray[i]];
            [signString appendString:keyValue];
        }else{
            NSString * keyValue = [NSString stringWithFormat:@"&%@=%@",afterSortKeyArray[i],valueArray[i]];
            [signString appendString:keyValue];
        }
    }
    return signString;
}

HmacMd5+Key加密

+(NSString *)hMacMD5String:(NSString *)string Key:(NSString *)keyStr
{
    const char *cKey  = [keyStr cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [string cStringUsingEncoding:NSUTF8StringEncoding];
    const unsigned int blockSize = 64;
    char ipad[blockSize];
    char opad[blockSize];
    char keypad[blockSize];
    
    unsigned int keyLen = (unsigned int)strlen(cKey);
    CC_MD5_CTX ctxt;
    if (keyLen > blockSize) {
        CC_MD5_Init(&ctxt);
        CC_MD5_Update(&ctxt, cKey, keyLen);
        CC_MD5_Final((unsigned char *)keypad, &ctxt);
        keyLen = CC_MD5_DIGEST_LENGTH;
    }
    else {
        memcpy(keypad, cKey, keyLen);
    }
    
    memset(ipad, 0x36, blockSize);
    memset(opad, 0x5c, blockSize);
    
    int i;
    for (i = 0; i < keyLen; i++) {
        ipad[i] ^= keypad[i];
        opad[i] ^= keypad[i];
    }
    
    CC_MD5_Init(&ctxt);
    CC_MD5_Update(&ctxt, ipad, blockSize);
    CC_MD5_Update(&ctxt, cData, (CC_LONG)strlen(cData));
    unsigned char md5[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final(md5, &ctxt);
    
    CC_MD5_Init(&ctxt);
    CC_MD5_Update(&ctxt, opad, blockSize);
    CC_MD5_Update(&ctxt, md5, CC_MD5_DIGEST_LENGTH);
    CC_MD5_Final(md5, &ctxt);
    
    const unsigned int hex_len = CC_MD5_DIGEST_LENGTH*2+2;
    char hex[hex_len];
    for(i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
          //小写加密改为小写字母x
        snprintf(&hex[i*2], hex_len-i*2, "%02X", md5[i]);
    }
    
    NSData *HMAC = [[NSData alloc] initWithBytes:hex length:strlen(hex)];
    NSString *hash = [[NSString alloc] initWithData:HMAC encoding:NSUTF8StringEncoding];
    return hash;
}
上一篇 下一篇

猜你喜欢

热点阅读