IPSec传输模式/隧道模式下ESP报文的装包与拆包过程
IPSec协议:IPsec将IP数据包的内容先加密再传输,即便中途被截获,由于缺乏解密数据包所必要的密钥,攻击者也无法获取里面的内容。
传输模式和隧道模式:IPsec对数据进行加密的方式有两种:传输模式和隧道模式。传输模式只是对IP协议的数据部分(payload)进行了加密,而隧道模式则是对整个IP数据包进行加密,就好像整个IP数据包在一个安全的隧道里传输一样
ESP:Encapsulating Security Payloads,封装安全载荷协议,IPsec所支持的两类协议中的一种。该协议能够在数据的传输过程中对数据进行完整性度量,来源认证以及加密,也可以防止回放攻击。另一种协议是AH(Authentication Headers)认证头协议
SA:SecurityAssociations,安全关联。SA是IPsec的重要概念,可以理解为被IPsec保护的某个连接的唯一标示。SA是单向的,即在一次安全的通信中,通信的两个方向(发送和接收)各需要创建一个SA。一个SA会包含很多的信息,而所有的SA都被存放在一个数据库中,称为SAD。
SD: Security Associations Database,安全关联数据库。每一个SA在SAD中都会有一个与之对应的条目 。一个SAD条目包含的内容有:顺序号计数器,顺序号溢出计数器,防回放窗口,SA有效期,AH协议中所使用的算法以及密钥,ESP协议用于认证以及完整性度量的算法,ESP协议用于加密数据的算法以及密钥,IPsec运行的模式以及两个通信设备间的传送数据包大小的最大上限。
通常一个SA可以由目的地址,IPsec所采用的协议(AH或ESP)和SPI来唯一确定。
SPI: Security Parameter Index,安全参数索引。用于将收到的IPsec数据包与其对应的SA 进行关联。
IPsec AH和ESP协议下报文封装后的结构:(注意:省略了mac部分)
IPsec ESP报文(传输模式)
装包过程:
1、在原IP报⽂文(包含IP、IP Datagram三部分)的末尾添加尾部(ESP Trailer)信息,
! 尾部包含三部分。由所选加密算法可能是块加密,那 么当最后⼀一块⻓长度不够时就需要进⾏行填充(padding),附上填充⻓长 度(Pad length)⽅方便解包时顺利找出⽤用来填充的那⼀一段数据。⽽而Next header则⽤用来标明被加密的数据报⽂文的类型,例如TCP
2、将IP Datagram部分以及第1步得到的ESP Trailer作为整体进⾏行加密,具体的加密算法与密钥由SA给出。
3、在第2步得到的加密数据添加ESP Header。ESP Header由两部分组成:SPI和 序号(Sequence number)。ESP Header位于IP之后。
4、将ESP Header和第2步得到的加密数据做⼀一个摘要,得到⼀一个完整性度量值(ESPMessage Authentication Code),并添加到ESP报⽂文的尾部。这样就得到了⼀一个完整的ESP数据报⽂文。
拆包过程:
1、接收⽅方收到数据报⽂文后,对除IP和ESP Message Authentication Code的部分计算摘要与ESP MAC进⾏行⽐比较,验证数据的完整性。假如⽐比对不同,可以断定所收到的报⽂文已经经过篡改了。
2、查看ESP Header,通过⾥里⾯面的SPI得到数据报⽂文所对应的SA;检查序列号,保证数据不是回放攻击。
3、根据SA所提供的加密算法与密钥,解密被加密算法加密过的部分(IP Datagram、ESPTrailer)。
4、根据ESP Trailer⾥里的填充⻓长度信息,可以找出填充字段的字段,删去后就能得到完整地IP Datagram
IPsec ESP报文(隧道模式)
装包过程:
1. 在原IP报文末尾添加尾部(ESP trailer)信息。如上图所示,尾部包含三部分。由所选加密算法可能是块加密,那么当最后一块长度不够时就需要进行填充(padding),附上填充长度(Pad length)方便解包时顺利找出用来填充的那一段数据。而Next header则用来标明被加密的数据报文的类型,例如TCP。
2. 将原IP报文以及第1步得到的ESP尾部作为一个整体进行加密。具体的加密算法与密钥由SA给出。
3. 为第2步得到的加密数据添加ESP头部。如上图所示,ESP头由两部分组成,SPI和序号(Sequence number)。加密数据与ESP头合称为“enchilada”。
4. 附加完整性度量结果(ICV,Integrity check value)。对第三步得到的“enchilada”做摘要,得到一个完整性度量值,并附在ESP报文
的尾部。
5. 加上新的IP头。新构造的IP头附在ESP报文的前面组成一个新的IP报文。注意这个新的IP头的目的地址跟源地址可以不一样。协议类型为50,说明它里面装的是一个IPsec报文。
拆包过程:
1. 接收方收到数据报文后,发现协议类型是50,故知道这是一个IPsec包。首先查看ESP头,通过里面的SPI决定数据报文所对应的SA。
2. 计算“enchilada”部分的摘要,与附在末尾的ICV做对比,如果一样的话说明数据是完整的。否则可以断定所收到的报文已经不是原来的报文了。
3.检查Seq里的顺序号,保证数据是“新鲜”的。
4.根据SA所提供的加密算法和密钥,解密被加密过的数据,即“enchilada”。得到原IP报文与ESP尾部(trailer)。
5. 根据ESP尾部里的填充长度信息,我们可以找出填充字段的长度,删去后就得到原来的IP报文。
6. 最后根据得到的原IP包的目的地址来进行转发。
IPSec传输模式/隧道模式下ESP报文的装包与拆包过程的更多相关文章
- IPSec 传输模式下ESP报文的装包与拆包过程 - 择日而终的博客
一.IPsec简介 IPSec ( IP Security )是IETF(Internet Engineering Task Force,Internet工程任务组)的IPSec小组建立的一组IP安全 ...
- IPsec传输模式下ESP报文的装包和拆包过程
原创文章,拒绝转载 装包过程 总体流程图 过程描述 在原IP报文中找到TCP报文部分,在其后添加相应的ESP trailer信息. ESP trailer 包含三部分:Padding,Pad leng ...
- IPSec传输模式下的ESP报文的装包和拆包过程
IPSec协议定义 IPsec将IP数据包的内容在装包过程在网络层先加密再传输,即便中途被截获,由于缺乏解密数据包所必要的密钥,攻击者也无法获取里面的内容. IPsec 对数据进行加密的方式 加密模式 ...
- UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究
内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...
- CORDIC算法(1):圆周旋转模式下计算三角函数和模值
CORDIC(Coordinate Rotation Digital Computer)坐标旋转数字计算机,是数学与计算机技术交叉产生的一种机器算法,用于解决计算机的数学计算问题.发展到现在,CORD ...
- Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...
- C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call问题。
今天遇到一个Access Violation的crash,只看crash call stack没有找到更多的线索,于是在debug模式下又跑了一遍,遇到了如下的一个debug的错误提示框: 这个是什么 ...
- [置顶] lvs-tun隧道模式搭建
一.lvs直接路由原理 由于图片还要一张一张上传,可以到下面网站下载我的word版本: http://download.csdn.net/user/y0908105023 补充基础知识: OSI(Op ...
- LVS负载均衡IP隧道模式原理介绍以及配置实战
LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...
随机推荐
- OpenCascade拓扑对象之:拓扑对象方向继承关系
@font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...
- [BZOJ 2287/POJ openjudge1009/Luogu P4141] 消失之物
题面: 传送门:http://poj.openjudge.cn/practice/1009/ Solution DP+DP 首先,我们可以很轻松地求出所有物品都要的情况下的选择方案数,一个简单的满背包 ...
- 9_Palindrome Number
9.Palindrome Number Determine whether an integer is a palindrome. An integer is a palindrome when it ...
- Flink的sink实战之二:kafka
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 双重河内塔I
双重河内塔问题 又称:双重汉诺塔问题 这是<具体数学:计算机科学基础(第2版)>中的一道课后习题 这道题也是挺有意义的,我打算写三篇随笔来讲这个问题 双重河内塔包含 2n 个圆盘,它们有 ...
- python_摘要_加密
import hashlib def get_md5(username,password): md5 = hashlib.md5(username.encode('utf-8')) # 加盐 md5. ...
- CSS圣杯布局、双飞翼布局详解
三栏布局中,经典中的经典应该就是圣杯布局.双飞翼布局没跑了.双飞翼布局和圣杯布局其实是一样的,只不过在写法上有些不同,其布局都是左右固定宽度,中间宽度自适应. 先熟悉一下圣杯布局.双飞翼布局中的特点: ...
- ubutun 服务器配置jupyter notebook
由于能力有限,学习机器学习时候发现,自己的电脑带不起来,所以想起了服务器,选择的是阿里的ubutun服务器,所以希望能够 使用jupyter notebook,看到网上一大片,配置和好久,才成功,在这 ...
- window.frames["id"].location使用
由于最近需要维护一个老项目不得不去学习一些自己都没接触过的项目,老项目中虽然技术已经被淘汰,但是思想还是值得去学习探究的,无论是jsp,freemarker,freemarker这些模板引擎还是Vue ...
- Java编发编程 - 线程池的认识(二)
核心线程池的内部实现 依然参考 JDK 对线程池的支持,各个接口.相关类之间的关系: (1)对于Executors中几个创建线程池方法底层实现: // 创建固定线程数量的线程池 public sta ...