HTTPS 安全原理 建立安全连接经过5次握手 SSL(Secure Socket Layer)/TLS(Transport Layer Security)

2023-11-05

安全通信的几个方面

HTTP是使用明文传输协议,使用明文传输导致信息容易泄漏,可是难道安全通信就只有这一个方面吗,我们必须要了解我们所面对的所有安全问题,才能往下解决问题,下面是几个安全问题

机密性

发送方和接收方希望只有他们能理解报文的内容
解决方案:加密算法

  1. 对称加密:加密和解密用的密钥(或密码表)相同,典型有凯撒密码、流密码、块密码、密码块链接
  2. 非对称加密:加密和解密用的密钥(或密码表)不相同,典型有RSA,(HTTP也是用非对称加密)

有时加密后也没有任何作用,中间人完全可以使用重放攻击,如你的密码加密后传输给服务器,但是中间人仍然能看到你密码的加密版本,如果加密算法每次加密相同内容时得到的结果都一样,中间人完全可以使用你密码的加密版本去传输给服务器登陆你账号,所以引入不重数概念

不重数: 在很长一段时间内不会重复的数,每次加密时会把不重数加在明文密码后面再一起加密,这样加密的东西一直都不会一样了,服务器如果收到和以前一样的密文可以选择丢弃该请求

报文完整性

发送方和接收方希望通信的内容在传输过程中未被改变
解决方法:密码散列函数(Hash函数)

  1. 散列算法如SHA-1是公开的,所以中间人完全可以先更改报文,再用算法对更改后的报文计算哈希值
  2. 发送方和接收方必须秘密商定一个鉴别密钥s,则假设报文为d,则计算哈希值时使用Hash(d+s) = m,然后只传递d
  3. 验证报文完整性时,接收方也用s来计算Hash(d+s)和哈希值m比对,中间人不知道s无法生成有效的哈希值,用这种方法生成的哈希值称为报文鉴别码MAC(Message Authentication Code),要与MAC (Media Access Control)地址 区分开

端点鉴别

发送方和接收方希望在通信过程中能鉴别彼此不是中间人伪造的
解决方法:非对称加密的公钥认证方式

  1. 当访问一个网站时,先获取其数字证书,它的数字证书怎么来的呢,是认证中心CA(Certification Authority) 颁发给它的
  2. CA把与它网站的身份信息和通信所需的公钥一起用CA的私钥加密生成一个数字证书,CA的公钥在我们的电脑里面(出厂自带)
  3. 我们用CA的公钥解密数字证书,证实该网站身份,同时取出该网站的公钥加密我们要传输给该网站的报文,这也保证了机密性

可以看出非对称加密的私钥和公钥加密解密顺序不同有不同的作用:
公钥加密私钥解密: 保证机密性
私钥加密公钥解密: 验证身份、数字证书

如某凡事件,中间人伪造双方(由于缺少端点鉴别),且大家都使用明文交流(没有保证机密性),中间人在传递消息时可以随意篡改消息(缺少报文完整性),如果当事人稍微有些网络安全的知识也不会如此吧(想法来自小林coding)

SSL(Secure Socket Layer)/TLS(Transport Layer Security)

SSL/TLS 安全套接字层/运输层安全性,是HTTPS在HTTP和TCP直接加了一层加密层,就可以保证通信安全了

SSL的加密过程

握手

发送方和接收方先建立TCP连接,发送方验证接收方是真正的接收方,发送方发给接收方一个主密钥(实际会更复杂,实际版本在下面)

密钥导出

  1. 发送方和接收方根据主密钥,各自导出4个四个密钥,两个对称加密密钥Ea,Eb,两个MAC密钥Ma,Mb
  2. 这个MAC密钥正是上面讲报文完整性的s,用于和数据报d组合起来一起计算Hash值来验证报文完整性的,对称加密密钥就是是用来加密报文的
  3. 为什么要两个对称加密密码了和两个MAC密钥呢,因为HTTP报文可以在客户端和服务器两个方向进行传输,所以不同方向用不同的对称加密密钥,不同方向用不同的MAC密钥
  4. 如从A——>B 加密报文用Ea,生成报文鉴别码MAC用Ma
    从B——>A 加密报文用Eb,生成报文鉴别码MAC用Mb

数据传输

  1. SSL会将数据流分割成SSL记录,对每个记录d附加一个MAC用于完整性检查,该MAC = Hash( d + Ma ) ,假设使用密钥Ma
  2. 然后用Ea加密该 记录+MAC,然后把加密后的数据封装在TCP数据报的数据中,经过TCP传输数据
  3. 但这样就没问题了吗,攻击者仍然可以更改TCP数据报头部的序号字段,调换两个TCP报文顺序,而该被篡改的报文仍然能通过SSL的安全认证
  4. 于是SSL维护一个序号,但该序号不加入SSL记录中,只是计算MAC时变为 Hash(d + Ma + 序号),如果被调换顺序了,则在接收方处无法通过报文完整性检测,会直接被丢弃,然后发送方就会通过TCP重传机制重新传输没被篡改的报文
  5. 无法通过报文完整性检测是因为接收方是根据TCP报文顺序生成对应报文的序号的,但TCP报文序号被修改了则报文顺序变了,如本来发送 100,200,300,400,500,而发送方也是根据SSL计时器维持的序号1,2,3,4,5计算的MAC,如果被交换顺序了100,200,400,300,500,那么接收方SSL计时器维持的序号仍然是1,2,3,4,5,但是此时3对应400,发送方计算的MAC=Hash(300 + Ma + 3),而接收方计算的MAC=Hash(400 + Ma + 3),两者肯定不一致

SSL记录格式

请添加图片描述

  1. 前三个字段是不加密的,只有数据和MAC会用Ea加密。
  2. 类型字段指出该字段是握手报文还是包含应用数据报文,也用于关闭SSL连接
  3. 看过这么多攻击情况了,敏锐的你是不是能想到,如果有攻击者修改类型字段关闭SSL连接,那么不是也可以让连接提前中断吗,这确实是一种攻击方式称为截断攻击(truncation attack)
  4. 但SSL记录虽然只加密数据和MAC,但是其报文鉴别码MAC确实根据整个SSL记录加上鉴别密钥Ma算出来的,如果有人修改了明文字段,也是通不过的完整性检测的

根据SSL记录格式,我们也很明显能找到接收方对SSL记录的解密过程,它会先拿会话密钥Ea解密出数据和MAC,再用把整个SSL记录加上鉴别密钥Ma再加上面提到的序号一起进行Hash计算,并把计算的值和MAC比对,如果比对通过了才算真正完成了一次安全通信

HTTPS建立连接流程

  1. TCP三次握手建立连接,必须先建立TCP双方才能通信,协商SSL协议细节
  2. 客户发送它支持的密码算法列表,连同一个客户的不重数
  3. 从该列表中,服务器选择一个对称算法、一种公钥算法和一种MAC(报文鉴别码)算法。它把它的选择以及证书和一个服务器不重数返回给客户
  4. 客户验证该证书,提取服务器的公钥,生成一个前主密钥PMS(Pre-Master Secret),用服务器的公钥加密该PMS,并将加密的PMS发送给服务器
  5. 使用相同的密钥导出函数,客户和服务器独立地从PMS和不重数中计算出主密钥MS(Master Secret)。然后该MS被切片生成两个对称加密密码和两个MAC密钥
  6. 客户发送所有握手报文的一个报文鉴别码MAC(Message Authentication Code)
  7. 服务器发送所有握手报文的一个MAC

从第二步开始就是SSL握手过程,最后为什么要所有握手报文发送MAC报文呢,因为在第一步客户发送它支持的密码算法列表和第二步服务器选择算法时都是明文发送的,攻击者可以把一些比较难破解的加密方式从列表中去掉,上面的不重数是为了防止多次连接中的重放攻击,而SSL自带的序号只能防止同一次连接中的重放攻击

参考
《计算机网络 自顶向下》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTPS 安全原理 建立安全连接经过5次握手 SSL(Secure Socket Layer)/TLS(Transport Layer Security) 的相关文章

随机推荐

  • python包管理-pip

    镜像列表 官方 已默认添加 豆瓣 清华大学 中国科技大学 阿里 网易镜像 腾讯镜像 华为镜像 北京外国语大学 哈尔滨工业大学 百度 https pypi python org simple http pypi doubanio com si
  • 基于爱奇艺HCDN视频分发网络的开放缓存

    为通过Internet向海量用户传输高清晰度 高码率的视频节目 爱奇艺融合CDN和P2P技术 开发出一套适合多终端的混合分发传输网络 HCDN 本文来自爱奇艺高级技术总监庹虎在LiveVideoStackCon 2018大会中的演讲 由Li
  • CTF-8 靶场夺旗

    兵无常势 水无常形 能因敌而致胜者 谓之神 环境准备 VMware Workstation Pro12 Kali Linux IP 10 10 16 128 CTF 8 虚拟机 NAT 网络连接 1 主机发现 fping asg 10 10
  • ubuntu10上安装万能五笔

    我听同事说ubuntu上运行eclipse会比window上快 我抱着好奇就安装了ubuntu来试玩玩 安装完毕 上网找资料的时候 发现我需要中文输入 尤其是五笔 后来返回到window上上网搜索 找到了些资料 知道如何通过ibus来使用拼
  • java泛型里能放多个类吗,具有多个类的Java泛型通配符

    小编典典 实际上 你可以做你想做的事 如果要提供多个接口或一个类加接口 则必须使通配符看起来像这样 请参见sun com上的泛型教程 特别是页面底部的 绑定类型参数 部分 实际上 如果需要 你可以列出多个接口 并 InterfaceName
  • Spring Boot 3.0学习笔记

    什么是Spring Boot Spring Boot是一个基于Spring Framework的快速开发Web应用的工具 它使用了约定优于配置的方式来快速构建应用 使得开发人员能够专注于业务逻辑的实现 而不用过多关注配置和框架集成问题 Sp
  • iostat 工具分析I/O性能

    iostat命令用途 主要用于监控系统设备的IO负载情况 iostat首次运行时显示自系统启动开始的各项统计信息 之后运行iostat将显示自上次运行该命令以后的统计信息 用户可以通过指定统计的次数和时间来获得所需的统计信息 iostat有
  • 若依框架密码验证环节修改(三方登录时改为跳过密码验证,但正常登录保留密码验证)

    当用到三方登录时 例如微信登录等 没法验证密码 又找不到若依密码的解密方式 套用此方法 跳过密码验证 并且为可选的 想让哪个方法登录时要密码或者不要 写上即可 我使用的是若依不分离版 但参考自官方文档 大差不差 具体见个人情况 参考地址 若
  • 【学习笔记】数据获取之爬虫笔记

    概述 疫情期间在风变编程 https www pypypy cn 上学习了爬虫的相关知识 风变编程是一个交互式学习网站 目前开的模块还不是很多但是交互式在线教学实验的形式还是十分有趣 交互式的形式教一个读书顺序 督催一行一行读书 告诉什么时
  • 网页唤起QQ在线聊天

    免费版 详见 https shang qq com v3 widget html 示例 a href http wpa qq com msgrd v 3 uin 1078363295 site qq menu yes 在线客服 a 目前还能
  • 【华师】C++简答题汇总

    简答题 斜体和代码块都是了解即可 面向对象四大特征 封装 抽象 继承 多态 对象 客观世界中的任何一个事物都可以视作一个对象 任何一个对象都己有两个要素 属性和行为 属性是对象本身的性质 而行为是对象的功能 C 中每个对象都是由数据和函数组
  • unity 项目强制退出通知服务器,MonoBehaviour.OnApplicationQuit() 当应用程序退出 - Unity5 中文 API 手册...

    Description 描述 Sent to all game objects before the application is quit 在应用退出之前发送给所有的游戏物体 In the editor this is called wh
  • FTP实现文件夹上传

    package com supcon orchid ChuanHuaCostom util import java io BufferedInputStream import java io BufferedOutputStream imp
  • TCP实现客户端和服务器端连接、文件上传,UDP发送消息、实现多线程在线咨询

    TCP实现客户端和服务器端连接 客户端 连接服务器Socket 发送消息 import java io IOException import java io OutputStream import java net InetAddress
  • python面对对象编程

    什么是面对对象编程 程序设定的范式 面对对象编程可以是代码程序更加的可控更加让人理解 面对对象编程就是把现实世界变得抽象并建立起对象模型 程序就是不同对象之间相互调用的逻辑 例 人 动物 车 这些都是现实世界的东西那就可以在这段代码中抽象出
  • UVM-寄存器模型

    目录 1 什么是寄存器 2 寄存器块 3 UVM寄存器模型 3 1 期望值 3 2 镜像值 3 3 创建寄存器类 3 4 定义寄存器块 3 5 寄存器env 4 完整例子 4 1设计 4 2 interface 4 3 寄存器 4 4 寄存
  • vscode不能选择python解释器

    command python select interpreter resulted in an error 解决方法 会看到左下角会有restricted mode这几个字 然后点这几个字 再选择Trust就可以了
  • 计算机网络(自顶向下)学习笔记——网络层

    第四章 网络层 4 1 概述 转发功能和路由选择功能的区别 转发涉及在单个的路由中从一条入链路到一条出链路的传送 路由选择涉及一个网络的所有路由器 他们经路由选择协议共同交互 决定分组从源到目地结点所采用的的路径 4 1 1 转发和路由选择
  • springmvc的常用注解

    1 RequestParam 1 作用在方法传递的参数前 用于接收所传参数 是springmvc中接受普通参数的注解 2 属性 value 请求参数中的名称 required 请求参数中是否提供此参数 默认为true defaultValu
  • HTTPS 安全原理 建立安全连接经过5次握手 SSL(Secure Socket Layer)/TLS(Transport Layer Security)

    文章目录 安全通信的几个方面 机密性 报文完整性 端点鉴别 SSL Secure Socket Layer TLS Transport Layer Security SSL的加密过程 握手 密钥导出 数据传输 SSL记录格式 HTTPS建立