一个app是否做到强大的加密方式,需要一个好的后台支撑,我有幸我们公司后台哥是珍爱网出来的大神,第一次知道用到除了以前md5 base64 等等单向加密还有ssl认证加密,一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探,其实但心的黑客用伪造的ssl认证链接伪造的服务器上。

1.话不多说,首先你得要你后台给提供他的证书


2.拖到你的项目管理里面,这是你要做的,记住的项目是.cer结尾的证书。

ios上架总是要选加密 ios上架总是要选加密账号_ios





ios上架总是要选加密 ios上架总是要选加密账号_ssl_02


3.我用到的是AFNetwrking这个框架。如果你自己用NSURLSession一样。


4.贴上代码



 

1. #import "MyDataService.h"   
2.   
3. #import "AFNetworking.h"  
4.   
5.   
6. #define BASE_URL @"xxxxxxxxx/"  
7.   
8. /**
9.  *  是否开启https SSL 验证
10.  *
11.  *  @return YES为开启,NO为关闭
12.  */  
13. #define LXPopenHttpsSSL YES  
14. /**
15.  *  SSL 证书名称,仅支持cer格式。
16.  */  
17.   
18. #define LXPcertificate @"mykey"  
19.   
20. //1.开发阶段: 测试服务器 -->ip ---> 
21. //2.上线  :  生产服务器 -->ip  -->   
22. @implementation MyDataService  
23.   
24. + (NSURLSessionDataTask *)requestURL:(NSString *)urlstring  
25.  httpMethod:(NSString *)method  
26.  params:(NSDictionary *)params  
27.  completion:(void(^)(id result,NSError *error))block {  
28.       
29. //1.拼接URL  
30. NSString *url = [BASE_URL stringByAppendingString:urlstring];  
31.  
32. #pragma mark - 设备唯一标识  
33. NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];  
34. #pragma mark - 设备信号  
35. NSString * strModel  = [UIDevice currentDevice].model;  
36.       
37. @"%@",identifierForVendor);  
38. @"%@",strModel);  
39.       
40.   
41.       
42.  
43. //3.创建AFHTTPSessionManager对象  
44. AFHTTPSessionManager *af = [AFHTTPSessionManager manager];  
45.       
46. NSString *userId1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"user_id"];  
47. NSString *token = [LXPTokenManager accessToken];  
48.       
49. 1 integerValue];  
50. @"%@",userId1);  
51.   
52. //设置请求头  
53. if ([urlstring isEqualToString:@"noauth/loginUser.do"]||[urlstring isEqualToString:@"noauth/getProvideTypeList.do"]||[urlstring isEqualToString:@"noauth/addUser.do"]) {  
54.           
55. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];  
56. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];  
57. .requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];  
58. .requestSerializer setValue:@"iOS" forHTTPHeaderField:@"client"];  
59.           
60.   
61.           
62. else{  
63.       
64.          
65. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];  
66. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];  
67. .requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];  
68. .requestSerializer setValue:@"iOS"forHTTPHeaderField:@"client"];  
69. @"%@",userId1);  
70.           
71. .requestSerializer setValue:[NSString stringWithFormat:@"%@",userId1] forHTTPHeaderField:@"userId"];  
72. .requestSerializer setValue:token forHTTPHeaderField:@"token"];  
73.           
74.   
75.   
76.     }  
77.       
78. .requestSerializer.timeoutInterval = 10;  
79.   
80. //设置请求参数的数据格式:JSON   默认:&拼接  
81. //    af.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:<#(NSJSONWritingOptions)#>];  
82.       
83. //设置服务器返回的数据,不做解析,默认:使用JSON解析  
84. .responseSerializer = [AFHTTPResponseSerializer serializer];  
85. // 加上这行代码,https ssl 验证。  
86.   if(LXPopenHttpsSSL)  
87.     {  
88.  setSecurityPolicy:[self customSecurityPolicy]];  
89.     }  
90.      af.securityPolicy = [selfcustomSecurityPolicy];
 此处改成这样 
    此 
    
 91.       
92.   
93. NSURLSessionDataTask *task = nil;  
94.       
95. //4.判断请求方式  
96. if ([method caseInsensitiveCompare:@"GET"] == NSOrderedSame) {  
97.           
98. //发送GET请求  
99.  GET:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {  
100.               
101. nil);  
102. NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
103. @"string _____________%@", string);  
104.   
105.               
106.               
107.  failure:^(NSURLSessionDataTask *task, NSError *error) {  
108.              
109. nil,error);  
110.               
111.         }];  
112.           
113.           
114.     }  
115. else if([method caseInsensitiveCompare:@"POST"] == NSOrderedSame) {  
116.           
117. //发送POST请求  
118.  POST:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {  
119.               
120. nil);  
121. //            NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
122. //            NSLog(@"string _____________%@", string);  
123.   
124.               
125.  failure:^(NSURLSessionDataTask *task, NSError *error) {  
126.               
127. nil,error);  
128.               
129.         }];  
130.           
131.     }  
132.       
133. return task;  
134.       
135. }  
136.   
137.   
138. + (AFSecurityPolicy*)customSecurityPolicy  
139. {  
140. // /先导入证书  
141. NSString *cerPath = [[NSBundle mainBundle] pathForResource:LXPcertificate ofType:@"cer"];//证书的路径  
142. NSData *certData = [NSData dataWithContentsOfFile:cerPath];  
143. @"====%@",certData);  
144. NSString *string;  
145.   
146.  alloc] initWithData:certData   encoding:NSUTF8StringEncoding];  
147. @"数据%@",string);  
148. //    NSData *data1 = [string dataUsingEncoding:NSUTF8StringEncoding];  
149. //    NSError *e;  
150. //    NSDictionary *dic2 = [NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableContainers error:&e];  
151. //    NSLog(@"=============>%@",dic2);  
152.       
153.       
154.       
155.       
156. //  
157. // AFSSLPinningModeCertificate 使用证书验证模式  
158. AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];  //此处要改
159.  

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; ;改成这样160.       
161. // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO  
162. // 如果是需要验证自建证书,需要设置为YES  
163. .allowInvalidCertificates = YES;  
164.       
165. //validatesDomainName 是否需要验证域名,默认为YES;  
166. //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。  
167. //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。  
168. //如置为NO,建议自己添加对应域名的校验逻辑。  
169. .validatesDomainName = NO;  
170.       
171. .pinnedCertificates = @[certData];  
172.       
173. return securityPolicy;  
174. }


接下来,我们通过Charles抓取数据,抓到的数据已经加密。

ios上架总是要选加密 ios上架总是要选加密账号_ios_03







一个app是否做到强大的加密方式,需要一个好的后台支撑,我有幸我们公司后台哥是珍爱网出来的大神,第一次知道用到除了以前md5 base64 等等单向加密还有ssl认证加密,一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探,其实但心的黑客用伪造的ssl认证链接伪造的服务器上。

1.话不多说,首先你得要你后台给提供他的证书


2.拖到你的项目管理里面,这是你要做的,记住的项目是.cer结尾的证书。

ios上架总是要选加密 ios上架总是要选加密账号_ios





ios上架总是要选加密 ios上架总是要选加密账号_ssl_02


3.我用到的是AFNetwrking这个框架。如果你自己用NSURLSession一样。


4.贴上代码


[objc]  view plain  copy

 

        
1. #import "MyDataService.h"   
2.   
3. #import "AFNetworking.h"  
4.   
5.   
6. #define BASE_URL @"xxxxxxxxx/"  
7.   
8. /**
9.  *  是否开启https SSL 验证
10.  *
11.  *  @return YES为开启,NO为关闭
12.  */  
13. #define LXPopenHttpsSSL YES  
14. /**
15.  *  SSL 证书名称,仅支持cer格式。
16.  */  
17.   
18. #define LXPcertificate @"mykey"  
19.   
20. //1.开发阶段: 测试服务器 -->ip ---> 
21. //2.上线  :  生产服务器 -->ip  -->   
22. @implementation MyDataService  
23.   
24. + (NSURLSessionDataTask *)requestURL:(NSString *)urlstring  
25.  httpMethod:(NSString *)method  
26.  params:(NSDictionary *)params  
27.  completion:(void(^)(id result,NSError *error))block {  
28.       
29. //1.拼接URL  
30. NSString *url = [BASE_URL stringByAppendingString:urlstring];  
31.  
32. #pragma mark - 设备唯一标识  
33. NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];  
34. #pragma mark - 设备信号  
35. NSString * strModel  = [UIDevice currentDevice].model;  
36.       
37. @"%@",identifierForVendor);  
38. @"%@",strModel);  
39.       
40.   
41.       
42.  
43. //3.创建AFHTTPSessionManager对象  
44. AFHTTPSessionManager *af = [AFHTTPSessionManager manager];  
45.       
46. NSString *userId1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"user_id"];  
47. NSString *token = [LXPTokenManager accessToken];  
48.       
49. 1 integerValue];  
50. @"%@",userId1);  
51.   
52. //设置请求头  
53. if ([urlstring isEqualToString:@"noauth/loginUser.do"]||[urlstring isEqualToString:@"noauth/getProvideTypeList.do"]||[urlstring isEqualToString:@"noauth/addUser.do"]) {  
54.           
55. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];  
56. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];  
57. .requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];  
58. .requestSerializer setValue:@"iOS" forHTTPHeaderField:@"client"];  
59.           
60.   
61.           
62. else{  
63.       
64.          
65. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];  
66. .requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];  
67. .requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];  
68. .requestSerializer setValue:@"iOS"forHTTPHeaderField:@"client"];  
69. @"%@",userId1);  
70.           
71. .requestSerializer setValue:[NSString stringWithFormat:@"%@",userId1] forHTTPHeaderField:@"userId"];  
72. .requestSerializer setValue:token forHTTPHeaderField:@"token"];  
73.           
74.   
75.   
76.     }  
77.       
78. .requestSerializer.timeoutInterval = 10;  
79.   
80. //设置请求参数的数据格式:JSON   默认:&拼接  
81. //    af.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:<#(NSJSONWritingOptions)#>];  
82.       
83. //设置服务器返回的数据,不做解析,默认:使用JSON解析  
84. .responseSerializer = [AFHTTPResponseSerializer serializer];  
85. // 加上这行代码,https ssl 验证。  
86.   if(LXPopenHttpsSSL)  
87.     {  
88.  setSecurityPolicy:[self customSecurityPolicy]];  
89.     }  
90.      af.securityPolicy = [selfcustomSecurityPolicy];
 此处改成这样     此     
 91.       
92.   
93. NSURLSessionDataTask *task = nil;  
94.       
95. //4.判断请求方式  
96. if ([method caseInsensitiveCompare:@"GET"] == NSOrderedSame) {  
97.           
98. //发送GET请求  
99.  GET:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {  
100.               
101. nil);  
102. NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
103. @"string _____________%@", string);  
104.   
105.               
106.               
107.  failure:^(NSURLSessionDataTask *task, NSError *error) {  
108.              
109. nil,error);  
110.               
111.         }];  
112.           
113.           
114.     }  
115. else if([method caseInsensitiveCompare:@"POST"] == NSOrderedSame) {  
116.           
117. //发送POST请求  
118.  POST:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {  
119.               
120. nil);  
121. //            NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
122. //            NSLog(@"string _____________%@", string);  
123.   
124.               
125.  failure:^(NSURLSessionDataTask *task, NSError *error) {  
126.               
127. nil,error);  
128.               
129.         }];  
130.           
131.     }  
132.       
133. return task;  
134.       
135. }  
136.   
137.   
138. + (AFSecurityPolicy*)customSecurityPolicy  
139. {  
140. // /先导入证书  
141. NSString *cerPath = [[NSBundle mainBundle] pathForResource:LXPcertificate ofType:@"cer"];//证书的路径  
142. NSData *certData = [NSData dataWithContentsOfFile:cerPath];  
143. @"====%@",certData);  
144. NSString *string;  
145.   
146.  alloc] initWithData:certData   encoding:NSUTF8StringEncoding];  
147. @"数据%@",string);  
148. //    NSData *data1 = [string dataUsingEncoding:NSUTF8StringEncoding];  
149. //    NSError *e;  
150. //    NSDictionary *dic2 = [NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableContainers error:&e];  
151. //    NSLog(@"=============>%@",dic2);  
152.       
153.       
154.       
155.       
156. //  
157. // AFSSLPinningModeCertificate 使用证书验证模式  
158. AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];  //此处要改
159.  

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; ;改成这样160.       
161. // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO  
162. // 如果是需要验证自建证书,需要设置为YES  
163. .allowInvalidCertificates = YES;  
164.       
165. //validatesDomainName 是否需要验证域名,默认为YES;  
166. //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。  
167. //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。  
168. //如置为NO,建议自己添加对应域名的校验逻辑。  
169. .validatesDomainName = NO;  
170.       
171. .pinnedCertificates = @[certData];  
172.       
173. return securityPolicy;  
174. }

接下来,我们通过Charles抓取数据,抓到的数据已经加密。


ios上架总是要选加密 ios上架总是要选加密账号_ios_03