iOS_對AFNetWorking的請求頭引數進行sha1加密

weixin_34041003發表於2018-02-10

前言:後臺為防止介面被抓包,毅然決然的要求我在新增一個請求的頭引數,並對該引數進行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 ~ .~ !

相關文章