美文网首页iOS Developer
重点 (十五) : MD5

重点 (十五) : MD5

作者: JonesCxy | 来源:发表于2016-09-19 09:18 被阅读79次

    MD5
    什么是MD5
    全称是Message Digest Algorithm 5,译为“消息摘要算法第5版”
    效果:对输入信息生成唯一的128位散列值(32个字符)

    MD5的特点
    输入两个不同的明文不会得到相同的输出值
    根据输出值,不能得到原始的明文,即其过程不可逆

    MD5的应用
    由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用
    主要运用在数字签名、文件完整性验证以及口令加密等方面

    MD5解密网站:http://www.cmd5.com

    1.png
    2.png

    MD5改进

    现在的MD5已不再是绝对安全,对此,可以对MD5稍作改进,以增加解密的难度

    加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5

    先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序

    总之宗旨就是:黑客就算攻破了数据库,也无法解密出正确的明文

    3.png

    上面的情况会造成以下问题
    用户流量的浪费
    程序响应速度不够快

    思考:如何解决?

    4.png
    5.png
    6.png
    7.png

    缓存的实现

    一般只对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内部已经做了处理。

    相关文章

      网友评论

        本文标题:重点 (十五) : MD5

        本文链接:https://www.haomeiwen.com/subject/dungettx.html