1 // 2 // ViewController.m 3 // IOS_0129_HTTP请求 4 // 5 // Created by ma c on 16/1/29. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "MBProgressHUD+MJ.h" 11 #import "NSString+Hash.h" 12 13 @interface ViewController () 14 @property (weak, nonatomic) IBOutlet UITextField *textName; 15 @property (weak, nonatomic) IBOutlet UITextField *textPassword; 16 17 - (IBAction)btnlogin; 18 19 @end 20 21 @implementation ViewController 22 23 /* 24 25 网络安全 26 1.常见加密算法 27 MD5\SHA\DES\3DES\RC2和RC4\RSA\IDEA\DSA\AES 28 2.加密算法的选择 29 通常公司都有本身的加密方案,按照公司的接口文档的规定去加密 30 3.MD5 31 1>全称:“Message Digest Algorithem5”,译为“消息摘要算法第五版” 32 2>效果:对输入信息生成惟一的128位散列值(32个字符) 33 3>特色: 34 a.输入两个不一样的明文不会获得两个相同的输出值 35 b.根据输出值,不会获得原始的明文,即其过程不可逆 36 4>应用 37 a.MD5加密算法有较好的安全性,并且免费,所以该加密算法被普遍应用 38 b.主要运用在数字签名、文件完整性验证以及口令加密等方面 39 5>MD5解密网站:http://www.cmd5.com 40 41 2.网络数据加密 42 1>加密对象:隐私数据,好比密码,银行信息 43 2>加密方案 44 a.提交隐私数据必须用POST请求 45 b.使用加密算法对隐私数据进行加密,好比MD5 46 3>加密加强:加大破解难度 47 a.对明文进行两个MD5加密:MD5(MD5($pass)) 48 b.先对明文进行撒盐,在进行MD5加密:MD5($pass.$salt) 49 50 3.本地存储加密 51 1>加密对象:重要数据,好比单击游戏数据 52 53 4.代码安全问题 54 1>如今已经有工具和技术能反编译出源代码:逆向工程 55 2>问题:如今反编译出来的都是C语言代码,可读性不高 56 3>优势:最起码能知道源代码里面用的是那些框架 ->指导咱们开发不了解的软件 57 4>解决方案:混淆代码 58 59 */ 60 61 - (void)viewDidLoad { 62 [super viewDidLoad]; 63 64 self.view.backgroundColor = [UIColor groupTableViewBackgroundColor]; 65 } 66 67 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 68 { 69 [self.view endEditing:YES]; 70 } 71 72 - (IBAction)btnlogin { 73 74 NSString *usernameText = self.textName.text; 75 if (usernameText.length == 0) { 76 [MBProgressHUD showError:@"请输入帐号"]; 77 return; 78 } 79 80 self.textPassword.secureTextEntry = YES; 81 NSString *password = self.textPassword.text; 82 if (password.length == 0) { 83 [MBProgressHUD showError:@"请输入密码"]; 84 return; 85 } 86 // 增长蒙板 87 [MBProgressHUD showMessage:@"正在拼命加载..."]; 88 89 //2.POST请求 90 NSString *strURL = @"http://localhost:8080/MJServer/login"; 91 NSURL *url = [NSURL URLWithString:strURL]; 92 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 93 94 //5s后请求超时(默认60s超时) 95 request.timeoutInterval = 5; 96 //设置请求方式 97 request.HTTPMethod = @"POST"; 98 //设置请求头 99 [request setValue:@"iPhone6" forHTTPHeaderField:@"User-Agent"]; 100 //对密码进行加密 101 password = [self doubleMD5:password]; 102 password = [self MD5Salt:password]; 103 password = [self MD5Reorder:password]; 104 //设置请求体 105 NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@",usernameText,password]; 106 //NSString -> NSData 107 request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; 108 109 //异步请求 110 [self sendAsyncWithRequest:request]; 111 112 } 113 //异步请求 114 - (void)sendAsyncWithRequest:(NSURLRequest *)request 115 { 116 NSOperationQueue *queue = [NSOperationQueue mainQueue]; 117 118 [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 119 120 //隐藏蒙版 121 [MBProgressHUD hideHUD]; 122 NSHTTPURLResponse *resp = (NSHTTPURLResponse *)response; 123 NSString *msg = [NSHTTPURLResponse localizedStringForStatusCode:resp.statusCode]; 124 NSLog(@"%ld %@ %@",resp.statusCode, msg, resp.allHeaderFields); 125 126 //这个block会在请求完毕的时候自动调用 127 if (connectionError || data == nil) { 128 [MBProgressHUD showError:@"请求失败"]; 129 return; 130 } 131 //解析服务器返回的JSON数据 132 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 133 NSString *error = dict[@"error"]; 134 if (error) { 135 [MBProgressHUD showError:error]; 136 } 137 else{ 138 NSString *success = dict[@"success"]; 139 [MBProgressHUD showSuccess:success]; 140 } 141 }]; 142 } 143 144 ///两次加密 145 - (NSString *)doubleMD5:(NSString *)text 146 { 147 return [[text md5String] md5String]; 148 } 149 150 ///先撒盐,在进行MD5加密 151 - (NSString *)MD5Salt:(NSString *)text 152 { 153 NSString *salt = [text stringByAppendingString:@"abc"]; 154 return [salt md5String]; 155 } 156 ///先加密,后乱序 157 - (NSString *)MD5Reorder:(NSString *)text 158 { 159 //加密 160 NSString *pwd = [text md5String]; 161 162 NSString *prefix = [pwd substringFromIndex:2]; 163 NSString *subfix = [pwd substringToIndex:2]; 164 165 //乱序 166 NSString *result = [prefix stringByAppendingString:subfix]; 167 168 return result; 169 } 170 171 @end