簽名算法要求:
請(qǐng)求參數(shù)增加、signStr,其中signTime為當(dāng)前時(shí)間戳、signStr為16位隨機(jī)字符串。
第一步,將所有請(qǐng)求參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),再使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對(duì)stringSignTemp進(jìn)行MD5運(yùn)算,再將得到的字符串所有字符轉(zhuǎn)換為大寫(xiě),得到sign值signValue。
注意: 簽名算法進(jìn)行簽名后作為發(fā)送請(qǐng)求時(shí)的一個(gè)參數(shù),
比如:發(fā)送請(qǐng)求時(shí)參數(shù)為NSDictionary*dict = @{ @"id" :@"10",
@"page":@"1",
@"signTime":@"1464147000",
@"signStr":@"c1bhbqiolpn6xs31"};
對(duì)參數(shù)進(jìn)行簽名
NSString *signStr = [xx encoingWithDic:dict?? Withcharacter:@"c1bhbqiolpn6xs31"];
把返回的簽名作為其中一個(gè)參數(shù)
[dict setObject:signStr forKey:@"sign"]
接下來(lái)就是用這個(gè)合成的字典進(jìn)行請(qǐng)求數(shù)據(jù)啦!
/** *? 加密url
?? dataDic? 要進(jìn)行簽名的字典
?? character? 隨機(jī)16位數(shù)?
*/
+(NSString*)encoingWithDic:(NSMutableDictionary*)dataDic Withcharacter:(NSString*)character
{? ?
? //當(dāng)前時(shí)間戳??
NSDate *datenow = [NSDate date];? ?
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];?
? [dataDic setObject:timeSp forKey:@"signTime"];? ?
//隨機(jī)16位數(shù)? ?
//NSString *randomStr = [NSString generateFradomCharacter];?
? [dataDic setObject:character forKey:@"signStr"];? ?
/*請(qǐng)求參數(shù)按照參數(shù)名ASCII碼從小到大排序*/? ?
NSArray *keys = [dataDic allKeys];? ?
//按字母順序排序? ?
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
{? ? ? ? return [obj1 compare:obj2 options:NSNumericSearch];?
? }];? ?
NSString *returnStr = @"";??
//拼接字符串? ?
for (int i=0;i<sortedArray.count;i++){
NSString *category = sortedArray[i];
if (i==0) {
returnStr =[NSString stringWithFormat:@"%@=%@",category,dataDic[category]];}else{
returnStr = [NSString stringWithFormat:@"%@&%@=%@",returnStr,category,dataDic[category]];}
???? }
/*拼接上key得到stringSignTemp*/
returnStr = [NSString stringWithFormat:@"%@&key=%@",returnStr,urlKey];
/*md5加密*/
returnStr = [self bigmd5:returnStr];
}
//md5 32位加密 (大寫(xiě))
+(NSString *)bigmd5:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[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]
];
}
//md5 32位 加密 (小寫(xiě))
+ (NSString *)md5:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[32];
CC_MD5( cStr, strlen(cStr), result );
return [NSString stringWithFormat:
@"xxxxxxxxxxxxxxxx",
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],
result[16], result[17],result[18], result[19],
result[20], result[21],result[22], result[23],
result[24], result[25],result[26], result[27],
result[28], result[29],result[30], result[31]];
}
//產(chǎn)生16位隨機(jī)數(shù)
+ (NSString *)generateFradomCharacter
{
static int kNumber = 16;
NSString *sourceStr = @"abcdefghijklmnopqrstuvwxyz0123456789";
NSMutableString *resultStr = [[NSMutableString alloc] init];
for (int i = 0; i < kNumber; i++)
{
unsigned index =? arc4random() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}
希望對(duì)大家有用!