前言:后台为防止接口被抓包,毅然决然的要求我在添加一个请求的头参数,并对该参数进行sha1加密,而且该参数加密之前有一定的算法格式(哈希算法,具体给的算法在这里我就不说了)。
1.在加密之前,先需要对满足后台给的格式,下面是我模拟
的格式是一个拼凑的字典
{
timestamp = 1518229804;
ua = iPhone;
}
2.然后需要把上面的字典转化成json字符串
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonSign options:-1 error:nil];
NSString *resultJson = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
下面解释一下options
参数
NSJSONWritingPrettyPrinted = (1UL << 0),
/* Sorts dictionary keys for output using [NSLocale systemLocale]. Keys are compared using NSNumericSearch. The specific sorting method used is subject to change.
*/
NSJSONWritingSortedKeys API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) = (1UL << 1)
-----------------------------------------------------
使用`NSJSONWritingPrettyPrinted`会出现 打印的是下面的字符串,带\n和\r
{
timestamp = 1518229804;
ua = iPhone;
}
使用`NSJSONWritingSortedKeys `会出现 打印的是下面的字符串,没有\n和\r
{ timestamp = 1518229804;ua = iPhone;}
//服务端老哥要求我传这个格式。但是这个参数只支持ios(11.0), 这时候咋办。下面分解
3.当然是使用NSJSONWritingPrettyPrinted
,然后去除空格和换行符...
resultJson = [resultJson stringByReplacingOccurrencesOfString:@"\r" withString:@""];
resultJson = [resultJson stringByReplacingOccurrencesOfString:@"\n" withString:@""];
4.进行sha1 加密
//sha1加密
NSData *sha1Data = [resultJson dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(sha1Data.bytes, (unsigned int)sha1Data.length, digest);
NSMutableString *sign = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
[sign appendFormat:@"%02x", digest[i]]; //得到sign
}
nice ~ .~ !