美文网首页
HTTPS深入底层探究【高级篇】

HTTPS深入底层探究【高级篇】

作者: 一眼万年的星空 | 来源:发表于2021-09-05 21:59 被阅读0次

    HTTP,HTTPS结构图

    HTTP-HTTPSs

    HTTPS作用:

    1.数字证书防止假冒服务器。
    2.混合加密:非对称加密防止对称秘钥泄露,对称加密防止内容被篡改。

    CA证书签名原理:

    1.服务器有一对公钥和私钥
    2.服务器把公钥给了CA认证机构,CA机构用CA密钥对 “CA的一些资料和服务器公钥”进行加密形成CA证书
    3.CA机构把CA证书返给服务器,服务器再发送给客户端
    4.客户端内置CA公钥,通过CA公钥验证数字证书的合法性,从CA证书中获取服务器的公钥。

    CA证书签名过程图

    苹果签名的原理:

    1.苹果有三端 苹果服务器 苹果手机 苹果电脑
    2.苹果电脑 请求证书颁布机构拿到csr文件 里面包含 公钥M和私钥M
    3.苹果服务器有私钥s
    4.苹果手机有公钥s
    5.两对公钥密钥所以一看就会知道这是双重非对称加密

    苹果签名

    SSL/TLS 协议基本流程:

    客户端向服务器索要并验证服务器的公钥。
    双方协商生产「会话秘钥」。
    双方采用「会话秘钥」进行加密通信。

    详细流程:
    1.TCP 三次握手
    2.TLS 三次握手:
    1):client hello: 客户端发送SSL版本、随机数C、支持的加密算法等信息给服务端
    2):server hello - server certificate - server hello - done: 服务端发送SSL版本、随机数、(根据客户端的支持的加密算法,选择出最高安全性的)加密方式、公钥、CA证书等信息给客户端
    3):finished
    3.客户端验证服务端证书(serverTrust)是否合法
    1):使用本地CA公钥解密服务端发过来的CA证书 ,来获取到服务器的公钥,
    2:)验证这个公钥与服务器直接发过来的公钥相比,看是否合法
    4.客户端生成 Pre-master(预主秘钥),用公钥加密后发给服务端
    5.服务端用私钥解密,拿到预主秘钥,这样双方都有 random c + random s + Pre-master, 根据协定的算法生成对称秘钥。之后双方就可以使用对称秘钥加解密。
    6.由于非对称加密安全性高、性能差。所以使用非对称获取到预主秘钥后,后续都是对称加密。

    HTTPS(TCP+TLC) HTTPS(TCP+TLC)

    参考文章地址

    网络参考模型:

    OSI+TCP/IP

    TCP & UDP

    UDP(用户数据报协议

    1.只管发送,不确认对方是否接收到。
    2.将数据源和目的封装成数据包中,不需要建立连接。
    3.每个数据报的大小限制在64K之内。
    4.因为无需连接,因此是不可靠协议。
    5.不需要建立连接,速度快。
    6.应用场景:多媒体教室/网络流媒体。

    TCP(传输控制协议)
    1.形成传输数据的通道。
    2.在连接中进行大数据传输(数据大小不受限制)。
    3.通过三次握手完成连接,是可靠协议,安全送达。
    4.必须建立连接,效率会稍低。

    TCP如何保证可靠性:
    ACK机制:

    1. 每个数据包都有seq。
      2.接收方收到发送方的数据包后,先验证数据的有效性(防止数据错误),再发送 3.seq + 1的ACK 回执。
      4.如果一定时间内没有收到,则继续向发送方要这个seq + 1的数据(防止数据丢失/延迟)。
      5.如果收到重复的包直接丢弃。
    ACK机制

    ACK延迟机制:
    如果每个数据包都响应ACK,数量量会很大。所以有了ACK延迟,一定时间内如果收到了多个数据包,只按照最后一个正确的数据,发送ACK。

    ACK延迟机制

    长/短连接 & 心跳包

    短连接
    1.数据请求结束后,立即断开连接。
    2.能够及时释放服务器资源。
    3.让服务器能够为更多的用户提供服务。

    长连接
    1.一旦连接建立之后,始终保持连接状态。
    2.后续只需发送和接收数据即可,数据响应更及时。
    3.长连接对服务器资源占用比较大。
    4.对交互响应要求快的应用,例如即时通讯,需要使用长连接。

    心跳包
    1.是检测长连接的重要技术手段。
    2.可以由服务器发送。
    定时向客户端发送小数据,根据回执判断客户端是否在线。
    3.也可以由客户端发送。
    定时向服务器发送小数据,报告客户端当前在线。

    socket, 基于TCP的长链接

    socket

    序列化 & 反序列化

    1.反序列化:在从服务器接收到数据之后,将二进制数据转换成 NSArray / NSDictionary。
    2.序列化:在向服务器发送数据之前,将 NSArray / NSDictionary 转换成二进制的过程。

    NSJSONSerialization 类

    专门负责在 JSON 和 Foundation 对象直接转换的类
    可以转换成 JSON 的 Foundation 对象需要具备以下条件:
    顶级节点是 NSArray 或者 NSDictionary
    所有的对象是 NSString, NSNumber, NSArray, NSDictionary 或者 NSNull
    所有字典的 key 是 NSString
    NSNumber 不是空或者无穷大


    NSJSONSerialization

    在实际开发中,获得网络的数组或者字典之后,通常会做字典转模型!反序列化的结果是否可变并不重要

    选项选择 0,表示任何附加操作都不做,效率最高!

    加密算法

    1.base64

    是网络上使用最广泛的编码系统,能够将任何二进制数据,转换成只有 65 个字符组成的文本文件
    az,AZ,0~9,+,/,=
    Base 64 编码后的结果能够反算,不够安全
    Base 64 是所有现代加密算法的基础算法

    OC:
    ///  BASE 64 编码
    - (NSString *)base64Encode:(NSString *)string {
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    
        return [data base64EncodedStringWithOptions:0];
    }
    
    ///  BASE 64 解码
    - (NSString *)base64Decode:(NSString *)string {
        NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
    
        return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }
    
    OC:
    # 将字符串 Man 进行 base64 编码
    $ echo -n "Man" | base64
    
    # 将字符串 TWFu 解码
    $ echo -n "TWFu" | base64 -D
    

    2.md5

    OC:
    # 得到文件的MD5值
    $ md5 文件名
    
    # 得到字符串的MD5值
    md5 -s "string"
    

    MD5的加密方案:

    md5 + 盐
    md5 多次
    md5 + 有规律的乱序

    /**
     *  先加密, 后乱序
     */
    - (NSString *)digest4:(NSString *)str
    {
        NSString *anwen = [str md5String];
    
        // 注册:  123 ----  2CB962AC59075B964B07152D234B7020
    
        // 登录: 123 --- 202CB962AC59075B964B07152D234B70
    
        NSString *header = [anwen substringToIndex:2];
        NSString *footer = [anwen substringFromIndex:2];
    
        anwen = [footer stringByAppendingString:header];
    
    
        NSLog(@"%@ - %@", str, anwen);
    
        return anwen;
    }
    
    

    3.钥匙串

    • 苹果的"生态圈",钥匙串访问,使用 AES 256 加密算法,能够保证用户密码的安全

    • 将数据存在手机上,即使卸载了app. 再重新装回来也能获取。同公司不同app 之间也能获取数据。

    • C语言的框架, 使用起来有点不太方便。不过有对应的OC开源三方框架

    三方框架的使用:

    /// 所有账户
    + (NSArray *)allAccounts;
    /// 获取所有账户信息
    + (NSArray *)accountsForService:(NSString *)serviceName;
    /// 获取账号密码
    + (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
    /// 删除账号密码
    + (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
    /// 将账号密码保存在钥匙串
    + (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;
    

    青山不改,绿水长流,后会有期,感谢每一位佳人的支持!

    相关文章

      网友评论

          本文标题:HTTPS深入底层探究【高级篇】

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