当前位置: 首页 > news >正文

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网络框架笔记》学习进阶跟多技术板块,可以点击查看详细类目。

相关文章:

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

OkHttp简介 由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。从Android4.4开始HttpURLConnection的底层实现采用的是OkHttp。 特点: 支持HTTP/2并允许对同一主机的所有请求共享一个套接字通过连接池,减少了请求延迟…...

Mac 安装使用NPM及常用命令

环境: Mac 工具: NPM 可通过官网查询一些模块相关 NPM Doc 通过官网文档了解更多的关于NPM的使用 安装 NPM是Node.js的包管理工具,可用于解决 Node.js在代码部署上的问题。 新版本的Node.js已经集成了NPM, 因此可通过下载 Nod…...

利用 JSqlParser 防止 SQL 注入

高手文章《jsqlparser:实现基于SQL语法分析的SQL注入攻击检查》介绍了利用 JSqlParser 防止 SQL 注入,写得很好,只不过有两个问题,代码比较复杂,我于是作了简化,只有两个类;其次检测比较严格,连…...

10.27~10.29数电第三次实验分析与问题

实验要求 分析 寄存器 D触发器有两个输出口,一个输入口,一个时钟信号,一个复位信号 同步异步就是说复位信号在不在always里 给它加一个load就成了一位寄存器, 寄存器堆 8个8位的寄存器堆,每个寄存器都有两读一写…...

【软考】14.3 设计模式

《设计模式》 有下划线:类模式 / 对象模式无下划线:对象模式 创建型 设计模式 创建对象 构建器(Builder):类和构造分离抽象工厂(Abstract Factory):抽象接口工厂(Factor…...

Mac docker+vscode

mac 使用docker vs code 通过vscode 可以使用docker容器的环境。 可以在容器安装gdb, 直接调试代码。 创建容易时候可以指定目录和容易目录可以共享文件。...

LLVM学习笔记(58)

4.4. 目标机器对象 在main()函数的350行,TimeCompilations默认为1,可以通过隐藏的选项“-time-compilations”来指定它的值,它的作用是重复进行指定次数的编译,以得到更好的编译用时数据。而在这个循环中调用的compileModule()&a…...

C语言 每日一题 PTA 10.30 day8

1.高空坠球 皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少? 输入格式 : …...

nacos在linux中的安装、集群的配置、mysql生产配置

1.下载和安装 官方下载地址:https://github.com/alibaba/nacos/releases,根据自己需要的本版去下载就行 下载的是 .tar.gz 后缀的文件是linux版本的 使用tar命令解压,完成之后是一个nacos的文件夹 和windows下的文件夹目录是一样的 要启…...

OpenAI 组建安全 AGI 新团队!应对AI“潘多拉魔盒”

夕小瑶科技说 原创 作者 | 小戏 一旦谈及未来 AI,除了天马行空的科幻畅想,不可避免的也有未来 AI 时代的末日预言。从 AI 武器化到 AI 欺骗,从邪恶 AI 到 AI 掌权,人工智能,尤其是通用人工智能的风险始终都清清楚楚的…...

上网行为管理软件有哪些丨功能图文超详细介绍

很多人都在后台问,上网行为管理软件到底是什么,有什么作用,今天就重点给大家讲解一下: 是什么 上网行为管理软件可以帮助企业规范员工的上网行为,提高办公效率,减少潜在威胁。 有哪些 在市面上&#xff…...

DVWA-SQL Injection SQL注入

概念 SQL注入,是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中,从而欺骗后端Web服务器以执行该恶意SQL语句。 成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据(插入/更新/删除)、对数据…...

【0基础学Java第四课】-- 逻辑控制

4. 逻辑控制 4.1 顺序结构4.2 分支结构4.2.1 if语句判断一个数字是奇数还是偶数判断一个数字是正数,负数,还是零判断一个年份是否为闰年 4.2.2 switch 语句 4.3 while循环打印 1 - 10 的数字计算 1 - 100 的和计算 5 的阶乘计算1!2&#xff0…...

C++中的std::cout与std::cerr、std::clog

本文用于记录C中std::cout与std::cerr、std::clog的异同 std::cerr 是C标准库中的标准错误输出流,用于向标准错误设备输出信息,通常用于报告程序的错误和异常情况。与之相对的,std::cout 是标准输出流,用于向标准输出设备输出一般…...

No authorization token was found

今天遇到了一个问题,我把前后端逻辑都理了一遍,开始怀疑后端,后端肯定没错了,把前端理了一遍,ok前后端没错,我错。登录哪里需要的token????把我搞懵逼了。 测…...

Kubernetes概述及其组件/核心组件

目录 1、K8S 是什么? 2、为什么要用 K8S? 3、k8s的特性 4、Kubernetes 集群架构与组件 5、核心组件 Master 组件 ●Kube-apiserver ●Kube-controller-manager ●Kube-scheduler 配置存储中心 ●etcd Node 组件 ●Kubelet ●Kube-Proxy ●docker 或…...

毫米波雷达实时采集教

https://www.cnblogs.com/dhyc/p/10510876.html 毫米波雷达实时采集教程---- 以及好网站总结:资料分享——RSP1 多普勒雷达开发套件...

Java进阶(HashMap)——面试时HashMap常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合,需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中HashMap集合的面试问题,结合源码分析题目背后的知识点。 关于List的博客文章如下: Java进阶(List)——面试…...

Kotlin 使用@BindingAdapter编译出错

在 Kotlin 中使用 BindingAdapter 注解时,需要确保你的项目正确配置了 Data Binding。 首先,请确保在项目的 build.gradle 文件中启用了 Data Binding: android {// ...dataBinding {enabled true} }接下来,请确保你在正确的地…...

Qt之信号和槽,connect参数分析

connect()方法 Qt进行信号和槽连接,有以下几种方法: static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType Qt::AutoConnection); static QMetaObj…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...