iOS開(kāi)發(fā)時(shí),為了防止匿名攻擊,服務(wù)器需要確保每個(gè)請(qǐng)求都是從被信任的客戶端發(fā)起的。所以我們?cè)诰W(wǎng)絡(luò)請(qǐng)求時(shí)需要對(duì)所有請(qǐng)求做一些加密處理,用于server端認(rèn)證。
這里是HMac加密方法,代碼如下:
+ (NSString *)HMacHashWithKey:(NSString *)key data:(NSString *)data{
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
//關(guān)鍵部分
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
length:sizeof(cHMAC)];
//將加密結(jié)果進(jìn)行一次BASE64編碼。
NSString *hash = [HMAC base64EncodedStringWithOptions:0];
return hash;
}
其中被加密的字段data,我們可以設(shè)定一種特殊的生成方式。
加密的密匙key也可以和server端商定一致。
這種加密方式依賴于一個(gè)庫(kù)CommonCryptor.
將加密后的hash在發(fā)送請(qǐng)求時(shí)添加到請(qǐng)求的header中,server端通過(guò)同樣的加密算法得到的hash如果相同,那么就可以確認(rèn),請(qǐng)求是由可以信任的客戶端發(fā)起的,認(rèn)證過(guò)程由此也完成了。