美文网首页iOS开发技巧
[iOS]iOS开发HmacMD5+Key加密

[iOS]iOS开发HmacMD5+Key加密

作者: 沵可安好 | 来源:发表于2020-08-10 14:38 被阅读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;
}

相关文章

  • [iOS]iOS开发HmacMD5+Key加密

    前言 最近公司要求接口请求统一要进行加密,大致方法是先将请求参数按key升序排序,拼接成串,然后用HmacMD5加...

  • iOS几种加密方式

    iOS 几种加密方法2017-06-19 [iOS开发] iOS常见的几种加密方法 普通加密方法是讲密码进行加密后...

  • 面试题总结

    1. iOS开发中的加密方式 iOS加密相关算法框架:CommonCrypto。 对称加密: DES、3DES、A...

  • iOS NFC 加密功能实现

    ios NFC加密功能实现 前言:记录一下ios开发中NFC添加密码功能,卡类型为(NFCMiFareTag --...

  • iOS 加密算法 CommonCrypto框架①【待补充】

    iOS 加密算法 iOS CommonCrypto框架① iOS 加密算法 iOS CommonCrypto框架②...

  • iOS中的RSA加密算法使用

    使用场景:iOS中部分隐私数据进行加密之后再传输到服务端 原理:在iOS开发中将需要加密的NSString类型的字...

  • iOS端加密

    转载: 史上最全iOS端数据加密类 iOS加密实用总结

  • iOS 证书小结

    iOS 证书小结 iOS开发需要开发者账号,如果要发布app还需要申请对应的证书。证书就是用来对app包进行加密,...

  • iOS代码加密常用加密方式

    iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密、AES加密、BASE64加密,三大...

  • iOS常用加密方式

    iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密、AES加密、BASE64加密,三大...

网友评论

    本文标题:[iOS]iOS开发HmacMD5+Key加密

    本文链接:https://www.haomeiwen.com/subject/migzrktx.html