💪
AndroidCollect
  • 写在前面
  • 计算机基础
    • 计算机组成原理
    • 算法
      • 查找
        • 二分查找
      • 排序
        • 简单排序
        • 高级排序
        • 特殊排序
      • 海量数据
      • 思想
        • 贪心
        • 分治
        • 动态规划
        • 回溯
      • 哈希算法
    • 数据结构
      • 队列
        • 知识点
        • 相关题目
          • 用两个栈实现队列
          • 实现循环队列
          • 用链表实现队列
          • 用数组实现队列
      • 栈
        • 相关算法题目
          • 用链表实现栈
          • 用数组实现栈
      • 链表
        • 知识点梳理
        • 相关算法题目
          • 删除倒数第n个结点
          • 合并两个有序链表
          • 检测单链表是否有环
          • 获取中间结点
          • 反转链表
      • 跳表
      • 哈希表
      • 树
        • 二叉树
        • 二叉查找树
        • AVL 树
        • Trie 树
        • 红黑树
      • 堆
        • 存储
        • 堆的应用
      • 图
    • 网络
      • 应用层协议
        • DNS
        • HTTP
        • HTTPS
      • 传输层协议
        • TCP
        • UDP
      • 输入网址后发生了什么
    • 操作系统
      • 内存
    • 数据库
  • 软件工程
    • 编程思想
    • 设计模式
      • 状态模式
      • 装饰器模式
      • 代理模式
      • 责任链模式
      • 建造者模式
      • 单例模式
      • 观察者模式
  • Java
    • 基础
    • 异常
    • 并发编程
      • ThreadLocal
      • 线程池
      • 理解 volatile
      • AbstractQueuedSynchronizer
    • 集合
      • LinkedHashMap 源码
      • HashMap 源码
    • 注解
    • 反射
      • JDK 动态代理
    • JVM
      • 自动内存管理机制
      • Class 文件格式
      • 类加载机制
      • Java 内存模型(JMM)
      • 字节码指令
      • HotSpot 虚拟机实现细节
    • 源码与原理
    • 各版本主要特性
  • Android
    • 基础组件
      • Context
      • Activity
        • 生命周期
        • 启动模式与任务栈
        • 启动流程
      • Service
      • ContentProvider
      • BroadcastReceiver
      • Fragment
      • View
        • 常用控件问题总结
          • RecyclerView
          • ViewPager2
        • CoordinatorLayout
        • SurfaceView
        • 事件分发
        • 绘制流程
        • 自定义 View
        • Window
    • 数据存储
      • 存储结构
      • Sqlite
      • 序列化
      • SharedPreferences
    • 资源
      • 图片加载
    • 动画
      • 属性动画
    • 线程和进程
      • Binder 机制
      • 跨进程通信
        • AIDL
    • 内部原理
      • 消息循环机制
      • Binder
      • Window
      • SparseArray
      • ArrayMap
      • RecyclerView
      • App 启动流程
    • 性能优化
      • 内存
        • 内存使用优化
        • 内存泄漏
      • 启动优化
      • 缩减包大小
      • 布局优化
      • ANR
    • 打包构建
      • dex 文件
      • APK 打包流程
      • APK 签名流程
    • 架构
      • 运行时
      • Android 系统架构
      • 应用项目架构
    • 开源框架源码或原理
      • RxJava
        • 使用笔记
        • 源码解析
      • Retrofit
      • ButterKnife
      • BlockCanary
      • LeakCanary
      • OkHttp
      • 图片加载
        • Glide
        • Picasso
    • 碎片化处理
      • 屏幕适配
    • 黑科技
      • 热修复
    • Jetpack
      • Lifecycle
      • Room
      • WorkManager
    • 新动态
      • AndroidX
      • 各系统版本特性
  • 开发工具
    • 正则表达式
    • ADB
    • Git
  • Kotlin
  • Flutter
  • 关于作者
  • 致谢
由 GitBook 提供支持
在本页
  • HTTP 的缺点
  • HTTPS
  • 加密
  • 身份验证
  • SSL/TLS
  • 握手
  • RSA
  • 相关问题
  • 为什么最后要发送所有报文的 hash 来互相校验?
  • HTTPS 抓包工具原理
  • 参考

这有帮助吗?

  1. 计算机基础
  2. 网络
  3. 应用层协议

HTTPS

HTTP 的缺点

明文传输,不安全。

HTTPS

HTTPS 主要解决了 HTTP 明文传输带来的数据安全问题,解决方式是通过加密(防止消息窃听)以及身份验证(防止中间人攻击)。

加密

采用了非对称加密和对称加密结合的方式,在通信开始先使用非对称加密来分发对称加密使用的秘钥,然后再使用对称加密进行消息发送。

非对称加密主要是 RSA 算法。

身份验证

身份验证主要是为了预防中间人攻击。引入证书颁发机构CA,将公共信息(比如域名)和公钥通过哈希算法计算消息摘要,然后使用CA的私钥对消息摘要进行加密,生成数字签名;通过数字签名和公共信息共同组成证书。

接收端到证书之后,先使用CA的公钥对数字签名进行解密得到原消息摘要,然后使用同样的哈希算法对公共信息计算消息摘要,对比两次消息摘要是否一致即可判断证书是否有效。

CA 采用分层设计,上层CA可以给下层CA做背书,而操作系统和浏览器通常会内置并信任一些顶级证书,来保证验证机制的执行。

SSL/TLS

保证机密性、完整性和端点鉴别。位于运输层和应用层之间,技术上属于应用层,但是从研发者的角度讲它属于运输层。

三个阶段:握手、秘钥导出和数据传输

握手

1. ClientHello

客户端发送内容:

  • 支持的协议版本,比如TLS 1.0版。

  • 一个客户端生成的随机数,稍后用于生成"对话密钥"

  • 支持的加密方法,对称加密算法、公钥加密算法和MAC(报文鉴别码)算法

2. ServerHello

服务器响应:

  • 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

  • 一个服务器生成的随机数,稍后用于生成"对话密钥"

  • 确认使用的加密方法

  • 服务器证书

如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。

3. 客户端回应

客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息:

  • 一个随机数(pre-master key)。该随机数用服务器公钥加密,防止被窃听。

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值(MAC),用来供服务器校验。

有了pre-master key以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。

4. 服务器回应

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息:

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送

  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

RSA

相关问题

为什么最后要发送所有报文的 hash 来互相校验?

防止握手过程中信息被篡改。例如在发送客户端算法列表时,攻击者可能会删除安全性强的算法,迫使双方选择较弱的算法,通过对握手过程中消息进行验证可以避免这个问题。

HTTPS 抓包工具原理

中间人攻击,需要先信任证书才可以。

参考

上一页HTTP下一页传输层协议

最后更新于5年前

这有帮助吗?

一个故事讲完https
神奇的RSA算法
SSL/TLS协议运行机制的概述
TLS 握手过程