2016年8月7日
網(wǎng)絡(luò)安全
1 Base64編碼
一般情況下僚匆,Post表單提交和Get參數(shù)提交的情況下微渠,都會暴露用戶信息的。采用Base64將字符串轉(zhuǎn)換成較長的字節(jié)編碼咧擂,達(dá)到隱藏?cái)?shù)據(jù)的目的逞盆。
iOS7.0之后,系統(tǒng)集成了Base64編碼松申,其步驟為
- 將字符串轉(zhuǎn)換成data
- 對data轉(zhuǎn)換成base64編碼云芦,參數(shù)傳0即可
代碼:
//1 帶加密字符串
NSString *str = @"hello";
//2 將字符串轉(zhuǎn)換成data
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
//3 加密data--base64--參數(shù)0,沒什么意義
NSString *baseStr = [data base64EncodedStringWithOptions:0];
NSLog(@"%@",baseStr);
終端命令
//編碼 -o表示輸出
base64 123.png -o 123.txt
//解碼 -D表示解碼
base64 123.txt -o 123.png -D
2 MD5散列
3 HTTPS請求
正經(jīng)八百的Https請求贸桶,如果涉及到證書驗(yàn)證等情況舅逸,如果設(shè)置好挑戰(zhàn)后,是不需要設(shè)置Info.plist里面的ATS的皇筛。
原理:
1 客戶端發(fā)起鏈接請求
2 服務(wù)器接收到請求后琉历,會生成私鑰和公鑰。并將公鑰水醋、證書信息旗笔、加密方式等放在一個(gè)受保護(hù)空間中發(fā)給客戶端
3 客戶端接收到這個(gè)challenge后,服務(wù)器驗(yàn)證證書合法性拄踪,并處理證書信任
4 如果服務(wù)器證書ok蝇恶,客戶端會隨機(jī)產(chǎn)生一個(gè)對稱的key,并用服務(wù)器發(fā)來的公鑰加密這個(gè)key,連同客戶端證書一并發(fā)給服務(wù)器
5 服務(wù)器接收到后惶桐,校驗(yàn)客戶端證書合法性撮弧,如果OK潘懊,用服務(wù)器私鑰加密得到客戶端發(fā)來的key。
6 服務(wù)器將響應(yīng)數(shù)據(jù)使用key加密贿衍,然后返回給客戶端授舟,通訊就正式開始了。
3.1 NSURLSession處理HTTPS請求
在使用NSURLSession來處理https請求的時(shí)候舌厨,我們只需要對服務(wù)器發(fā)來的challenge做處理岂却,其他的都有系統(tǒng)為我們處理。拿到challenge后裙椭,如果是需要服務(wù)器信任操作躏哩,我們就需要設(shè)置接收并安裝服務(wù)器證書,設(shè)置信任方式為服務(wù)器信任揉燃。
例如扫尺,我們以訪問https://12306為例,進(jìn)行代碼說明
viewDidLoad方法體(加載后就開始請求)
-(void)viewDidLoad
{
[super viewDidLoad];
//1 不需要設(shè)置ATS
//2 創(chuàng)建URL
NSURL *url = [NSURL URLWithString:@"https://www.12306.cn/mormhweb/"];
//3 創(chuàng)建request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//4 創(chuàng)建session--代理為控制器炊汤,configuration為默認(rèn)正驻,代理執(zhí)行隊(duì)列為主隊(duì)列
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//5 創(chuàng)建數(shù)據(jù)請求任務(wù)--并使用block來處理接收到的數(shù)據(jù)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
NSLog(@"error----%@",error);
}];
//6 開始任務(wù)
[task resume];
}
設(shè)置代理--用來處理服務(wù)器發(fā)過來的challenge
-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
{
//如果是服務(wù)器證書信任,我們才需要處理
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
//從challenge的受保護(hù)空間中拿到服務(wù)器信任抢腐,用來創(chuàng)建授權(quán)信息--授權(quán)可信任
NSURLCredential *cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
//調(diào)用block來設(shè)置
//--NSURLSessionAuthChallengeUseCredential 枚舉類型姑曙,表示使用證書
//--cre--剛才創(chuàng)建的授權(quán)信息
completionHandler(NSURLSessionAuthChallengeUseCredential,cre);
}
}
3.2 AFNetworking處理HTTPS請求
步驟:
- 添加ATS,在info.plist里面添加屬性
- 發(fā)送請求之前迈倍,修改manager的安全策略
- 發(fā)送請求
代碼
- (void)viewDidLoad {
[super viewDidLoad];
//1 獲取請求地址
NSString *url = @"https://www.12306.cn/mormhweb/";
//2 獲取http請求管理器
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//3 設(shè)置安全策略--對證書-域名等處理方式
manager.securityPolicy.allowInvalidCertificates = YES;//不管證書是自簽名證書還是CA證書都接收
manager.securityPolicy.validatesDomainName = NO;//不去校驗(yàn)域名
//4 設(shè)置manager的其他屬性
manager.responseSerializer = [AFHTTPResponseSerializer serializer];//--讓接收的響應(yīng)不自動解析伤靠,仍然保持Http的二進(jìn)制數(shù)據(jù)
manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"text/html"]];
//5 發(fā)起Get請求
[manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success---%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error-----%@",error);
}];
}