用户访问网络免不了将一些数据上传到服务器,
可能是一些图片,也有可能是账号密码,
如何将这些数据进行处理,才能保证安全?
仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题
可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据
因此:提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交
常见的加密算法
MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES
加密算法的选择
一般公司都会有一套自己的加密方案,按照公司接口文档的规定去加密
一.利用算法加密(以MD5为例)
什么是MD5
全称是Message Digest Algorithm 5,译为“消息摘要算法第5版”
效果:对输入信息生成唯一的128位散列值(32个字符)
MD5的特点
输入两个不同的明文不会得到相同的输出值
根据输出值,不能得到原始的明文,即其过程不可逆
包含了苹果的原生库
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonHMAC.h>
- (NSString *)md5String
{
const char *string = self.UTF8String;
int length = (int)strlen(string);
unsigned char bytes[CC_MD5_DIGEST_LENGTH];
CC_MD5(string, length, bytes);
return [self stringFromBytes:bytes length:CC_MD5_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(unsigned char *)bytes length:(int)length
{
NSMutableString *mutableString = @"".mutableCopy;
for (int i = 0; i < length; i++)
[mutableString appendFormat:@"%02x", bytes[i]];
return [NSString stringWithString:mutableString];
}
二.使用https协议
在URL前加https://前缀表明使用SSL加密的,你的电脑与服务器之间收发的信息传输将更加安全
Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定
http和https使用的而是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.
http的连接很简单,是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议要比http协议安全
SSL(安全套接层)
- (void)viewDidLoad {
[super viewDidLoad];
//实现代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com/cn/"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
[task resume];
}
#pragma mark - <NSURLSessionTaskDelegate>
/**
* challenge :挑战,质询
* completionHandler:通过调用这个block,来告诉URLSession要不要接收这个证书
* NSURLSessionAuthChallengeDisposition 如何处理这个安全证书
* NSURLCredential 安全证书
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {
//如果不是服务器信任类型得证书,直接返回
if (![challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
return;
}
//根据服务器的信任信息创建证书对象
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
//保证不为空
if (completionHandler) {
//利用这个block使用这个证书
completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
}
//这也是一种写法
// !completionHandler ? : completionHandler(NSURLSessionAuthChallengeUseCredential,challenge.proposedCredential);
NSLog(@"-----didReceiveChallenge");
}
AFNetworking框架等内部已经对https安全证书进行了验证,不需要我们做多余的判断。