Dictionary key 根據(jù)ASCII排序并拼接key和value并HMACMD5-iOS

//簽名算法
//簽名生成的通用步驟如下:
//第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
//特別注意以下重要規(guī)則:
//◆ 參數(shù)名ASCII碼從小到大排序(字典序);
//◆ 如果參數(shù)的值為空不參與簽名;
//◆ 參數(shù)名區(qū)分大小寫;


+(NSString *)signStr:(NSMutableDictionary*)dict
{
    NSMutableString *contentString  =[NSMutableString string];
    NSArray *keys = [dict allKeys];
    //按字母順序排序
    NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1 compare:obj2 options:NSNumericSearch];
}];
//拼接字符串
  for (NSString *categoryId in sortedArray) {

      if (![[dict objectForKey:categoryId] isEqualToString:@""]
          && ![[dict objectForKey:categoryId] isEqualToString:@"sign"]
          && ![[dict objectForKey:categoryId] isEqualToString:@"key"]
        )
    {
        [contentString appendFormat:@"%@%@", categoryId, [dict objectForKey:categoryId]];
    }
  }
//HMACMD5
  NSString *signStr = [SignTool HMACMD5WithString:contentString WithKey:APPSECRET];
  return signStr;
}
+ (NSString *)HMACMD5WithString:(NSString *)toEncryptStr WithKey:(NSString *)keyStr
{
 const char *cKey  = [keyStr cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [toEncryptStr cStringUsingEncoding:NSUTF8StringEncoding];
const unsigned int blockSize = 64;
char ipad[blockSize];
char opad[blockSize];
char keypad[blockSize];

unsigned int keyLen = 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, 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++) {
    snprintf(&hex[i*2], hex_len-i*2, "%02x", md5[i]);
}

NSData *HMAC = [[NSData alloc] initWithBytes:hex length:strlen(hex)];
NSString *hashStr = [[NSString alloc] initWithData:HMAC encoding:NSUTF8StringEncoding] ;
NSString *hash= [hashStr uppercaseString];

return hash;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容