MD5
什么是MD5
全称是Message Digest Algorithm 5,译为“消息摘要算法第5版”
效果:对输入信息生成唯一的128位散列值(32个字符)
MD5的特点
输入两个不同的明文不会得到相同的输出值
根据输出值,不能得到原始的明文,即其过程不可逆
MD5的应用
由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用
主要运用在数字签名、文件完整性验证以及口令加密等方面
MD5解密网站:http://www.cmd5.com
MD5改进
现在的MD5已不再是绝对安全,对此,可以对MD5稍作改进,以增加解密的难度
加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5
先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序
总之宗旨就是:黑客就算攻破了数据库,也无法解密出正确的明文
上面的情况会造成以下问题
用户流量的浪费
程序响应速度不够快
思考:如何解决?
缓存的实现
一般只对GET请求进行缓存,不必对POST请求进行缓存
GET请求一般用来查询数据
POST请求一般是发大量数据给服务器处理(变动性比较大)
在iOS中,可以使用NSURLCache类缓存数据
iOS 5之前:只支持 内存缓存
iOS 5开始:同时支持 内存缓存和 硬盘缓存
NSURLCache了解
缓存原理:一个NSURLRequest对应一个NSCachedURLResponse
缓存技术:数据库
NSURLCache
NSURLCache的常见用法
获得全局缓存对象(没必要手动创建)
NSURLCache *cache = [NSURLCache sharedURLCache];
设置内存缓存的最大容量(字节为单位,默认为512KB)
-(void)setMemoryCapacity:(NSUInteger)memoryCapacity;
设置硬盘缓存的最大容量(字节为单位,默认为10M)
-(void)setDiskCapacity:(NSUInteger)diskCapacity;
硬盘缓存的位置:沙盒/Library/Caches
取得某个请求的缓存
-(NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest
*)request;
清除某个请求的缓存
-(void)removeCachedResponseForRequest:(NSURLRequest *)request;
清除所有的缓存
- (void)removeAllCachedResponses;
缓存GET请求
要想对某个GET请求进行数据缓存,非常简单
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
设置缓存策略
request.cachePolicy= NSURLRequestReturnCacheDataElseLoad;
只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存
缓存策略
iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有3种)
NSURLRequestUseProtocolCachePolicy 默认的缓存策略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData 忽略缓存,重新请求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData 未实现
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData 忽略缓存,重新请求
NSURLRequestReturnCacheDataElseLoad
有缓存就用缓存,没有缓存就重新请求
NSURLRequestReturnCacheDataDontLoad
有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
NSURLRequestReloadRevalidatingCacheData 未实现
缓存的使用注意
缓存看起来很美好,但需要谨慎使用
如果请求某个URL的返回数据
经常更新:不能用缓存!比如股票、彩票数据
一成不变:果断用缓存
偶尔更新:可以定期更改缓存策略 或者 清除缓存
如果大量使用缓存,会越积越大,建议
定期清除缓存
**********************笔记***********************
1.HTTPS的基本使用
1.https简单说明
HTTPS(全称:Hyper
Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。
https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
2.HTTPS和HTTP的区别主要为以下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
2.对开发的影响。
2.1 如果是自己使用NSURLSession来封装网络请求,涉及代码如下。
- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event
{
NSURLSession *session = [NSURLSession
sessionWithConfiguration:[NSURLSessionConfiguration
defaultSessionConfiguration] delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL
URLWithString:@"https://www.apple.com"]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"%@", [[NSString
alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
[task
resume];
}
只要请求的地址是HTTPS的, 就会调用这个代理方法
我们需要在该方法中告诉系统, 是否信任服务器返回的证书
Challenge: 挑战 质问(包含了受保护的区域)
protectionSpace : 受保护区域
NSURLAuthenticationMethodServerTrust : 证书的类型是 服务器信任
- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void
(^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
NSLog(@"didReceiveChallenge
%@", challenge.protectionSpace);
NSLog(@"调用了最外层");
1.判断服务器返回的证书类型,
是否是服务器信任
if
([challenge.protectionSpace.authenticationMethod
isEqualToString:NSURLAuthenticationMethodServerTrust]) {
NSLog(@"调用了里面这一层是服务器信任的证书");
NSURLSessionAuthChallengeUseCredential
= 0, 使用证书
NSURLSessionAuthChallengePerformDefaultHandling = 1,
忽略证书(默认的处理方式)
NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 忽略书证, 并取消这次请求
NSURLSessionAuthChallengeRejectProtectionSpace = 3,
拒绝当前这一次, 下一次再询问
NSURLCredential *credential = [NSURLCredential
credentialForTrust:challenge.protectionSpace.serverTrust];
NSURLCredential *card = [[NSURLCredential
alloc]initWithTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential , card);
}
}
2.2 如果是使用AFN框架,那么我们不需要做任何额外的操作,AFN内部已经做了处理。