• OkHttp网络框架深入理解-SSL握手与加密


    OkHttp简介

    由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。从Android4.4开始HttpURLConnection的底层实现采用的是OkHttp。

    特点:

    • 支持HTTP/2并允许对同一主机的所有请求共享一个套接字
    • 通过连接池,减少了请求延迟
    • 默认通过GZip压缩数据
    • 响应缓存,避免了重复的网络请求
    • 请求失败自动重试主机的其他ip,自动重定向

    什么是SSL

    SSL其实就是Secure Scoket Layer安全套接层,提供了一种为网络通信提供安全以及数据完整性的安全协议,再传输层对网络进行加密。

    • SSL记录协议: 为高层协议提供安全封装,压缩,加密等基本功能
    • SSL握手协议:用与再数据传输开始前进行通信双方的身份验证、加密算法协商、交换秘钥

    https安全的http协议是建立在SSL层或TLS层上的http协议,在普通的传输层和http应用层之间插入SSL或TLS安全层。

    https使用非对称加密进行加密秘钥协商,采用对称加密方式对报文进行加密处理以保证安全性

    https不同于http,使用443端口作为默认端口,建立TCP连接后,会初始化SSL层,对加密参数进行沟通并交换秘钥。

    非对称加密

    数字签名技术

    数字签名技术是为了证明数据的完整性,未经过的三方修改(发送者身份的真实性);主要包括两个方面:摘要算法和加密。

    1.摘要算法通过哈希处理将原始信息转换成固定长度的序列,确保输入到输出的一一映射,原始信息的变化将导致输出结果的变化,常见的有MD5,SHA-1,SHA-256等。

    2.加密采用非对称加密,私钥加密保证加密后的摘要信息无法更改

    数字签名流程:

    1、对原始信息进行摘要算法处理,得到摘要信息,使用私钥对摘要信息进行加密,生成签名。

    2、签名与原始信息合并成最终签名文件发布

    3、接收方使用公钥将签名文件中的数字签名进行解密

    4、对原始信息进行摘要算法处理

    5、对比3、4步的结果,一致说明文件未被更改;

    数字证书

    1.数字证书包含有公钥,证书有效期,发证机构等信息;数字证书需要向CA机构申请,获取到的数字证书是经过签名处理的。

    1. CA机构的根证书是没有经过签名的数字证书,可以直接拿到其公钥。

    2. CA机构颁发的次级证书已经使用私钥进行了签名处理,可以使用CA根证书中的公钥进行解密获得次级证书中的公钥。能正常解密才能说明次级证书的合法性。

    3. 客户端持有CA根证书,在服务端发送申请到的数字证书给客户端后,客户端使用根证书公钥解密处理,验证服务端证书。

    SSL握手过程

    ssl握手过程完成加密算法的协商和加密秘钥的确定,双方数字证书的认证工作。

    具体流程如下:

    • 1.客户端发起连接请求,发送客户端支持的SSL版本号,加密算法(密码套件/Cipher Suites)列表,随机数给服务端
    • 密码套件格式:每个套件都以“SSL”开头,紧跟着的是密钥交换算法。用“With”这个词把密钥交换算法、加密算法、散列算法分开,例如:SSL_DHE_RSA_WITH_DES_CBC_SHA, 表示把DHE_RSA(带有RSA数字签名的暂时Diffie-HellMan)定义为密钥交换算法;把DES_CBC定义为加密算法;把SHA定义为散列算法。
    • 2.服务端在客户端支持的加密算法中选择一组,和服务端证书(包含公钥)、一个随机数一起发给客户端
    • 3.客户端对服务端的证书进行验证并获取公钥,产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加/解密),并将加密后的信息发送给服务器;
    • 4.客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值(第1,2步中的随机数)独立计算出加密和MAC密钥。

    这里有三个秘钥:服务端证书传递的公钥,隐含的服务端持有的私钥,最终的加密秘钥;

    公钥和私钥是非对称加密算法的秘钥,主要用于服务端和客户端协商生成最终的加密秘钥,保证协商过程的保密性

    最终生成的加密秘钥匙对称加密算法的秘钥,主要用于后面数据交换的加密

    pre_master_secret是客户端生成的一段随机码用于生成最终的加密秘钥(使用秘钥交换算法)。

    以上流程是单向认证流程即只有客户端对服务端进行认证

    本文是对okhttp网络框架中的SSL握手与加密的简单介绍与理解,更多有关可以前往《okhttp网络框架笔记》学习进阶跟多技术板块,可以点击查看详细类目。

  • 相关阅读:
    Python 1-06 练习
    单机运行多个独立浏览器
    提升用户体验,给你的模态弹窗加个小细节
    【面试】EntityFramework&Linq面试题&答案
    A_A03_002 51(STC)单片机程序串口烧录
    PostgreSQL数据库统计信息——analyze执行函数
    云环境固有特性及其对密码效能的挑战
    举个栗子~Tableau 技巧(232):用工作表创建多行列图例
    每日一博 - 图解进程(Process)和线程(Thread)区别联系
    [附源码]Python计算机毕业设计Django健康医疗体检
  • 原文地址:https://blog.csdn.net/m0_70748845/article/details/134038861