一个app是否做到强大的加密方式,需要一个好的后台支撑,我有幸我们公司后台哥是珍爱网出来的大神,第一次知道用到除了以前md5 base64 等等单向加密还有ssl认证加密,一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探,其实但心的黑客用伪造的ssl认证链接伪造的服务器上。
1.话不多说,首先你得要你后台给提供他的证书
2.拖到你的项目管理里面,这是你要做的,记住的项目是.cer结尾的证书。
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抓取数据,抓到的数据已经加密。
一个app是否做到强大的加密方式,需要一个好的后台支撑,我有幸我们公司后台哥是珍爱网出来的大神,第一次知道用到除了以前md5 base64 等等单向加密还有ssl认证加密,一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探,其实但心的黑客用伪造的ssl认证链接伪造的服务器上。
1.话不多说,首先你得要你后台给提供他的证书
2.拖到你的项目管理里面,这是你要做的,记住的项目是.cer结尾的证书。
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抓取数据,抓到的数据已经加密。