「IPSEC-VPN」 – ESP | Encapsulating Security Payload

IP.Protocol == 50

原理简述

ESP 支持认证和加密功能。ESP 在每一个数据包的标准 IP 报头后面添加一个 ESP 报文头,并在数据包后面追加一个 ESP 尾(ESP Trailer 和 ESP Auth data)。与 AH 不同的是,ESP 将数据中的有效载荷进行加密后再封装到数据包中,以保证数据的机密性,但 ESP 没有对 IP 头的内容进行保护,除非 IP 头被封装在 ESP 内部(采用隧道模式);

特性特征

ESP 提供数据完整保护、数据原始身份认证、防重放服务、机密性保护;

机密性保护:ESP 使用一系列加密算法提供机密性,

数据完整性:由认证算法保证。具体使用过程中采用的算法则是由 ESP 安全联盟的相应组件决定的;

防重放服务:另外 ESP 能够通过序列号提供防重放服务,至于是否采用则由数据包的接收者来决定。这是因为一个唯一的、单向递增的序列号是由发送端插入的,但却并不要求接收端对该数据报进行检验。由于这项保护对安全性大有好处,所以一般都会采用;

封装结构

                | IP Header | ESP Header | Data | ESP Trailer | ESP Auth |      // 传输模式

                             | IP Header | Data |                               // 原始数据

| New IP Header | ESP Header | IP Header | Data | ESP Trailer | ESP Auth |      // 隧道模式

进行认证的部分:ESP Header 到 ESP Trailer 所有内容;

进行加密的部分:ESP Header 之后ESP Trailer 所有内容;

报文格式

Security Parameters Index(安全参数索引)

IPsec 安全参数索引,用于唯一标识 IPsec 安全联盟;

该值 IP Header 之前的目标地址以及协议结合在一起,用来标识特定的安全联盟。SPI 本身是个任意数,可以是使用者自己指定,也可交由一些密钥管理技术自行协商决定。需要注意的是,SPI 可以经过了验证,但却无法被加密。这是必不可少的一种做法,因为 SPI 用于 SA 的标识,指定了采用的加密算法以及密钥,并用于对包进行解密。如果 SPI 本身已被加了密,否则我们会碰到“先有鸡还是先有蛋”的问题;

Sequence Number(序列号)

是一个从 1 开始的单项递增的计数器,唯一地标识每一个数据包,用于防止重放攻击;

是一个独一无二、单向递增、并由发送端插在 ESP Header 中的一个 32 位数值。通过序列号,ESP 具有了防重放的能力。与 SPI 一样,序列号经过了验证,但却没有加密。这是由于我们希望在协议模块处理流程的最前端可以根据它判断一个包是否重复,然后决定是否丢弃这个包,而不至于动用更多的资源对其进行解密;

Initialization Vector

某些加密算法需要初始化响亮,所以报文可能包含 IV 字段,64-bit,位于 Sequence Number 后面;

该 IV 不包含在加密之中,但包含在认证之中;

Padding

在 ESP Header 中,Padding 主要有三个功能:
1)某些加密算法对输入的明文有严格的定义,例如明文的大小必须是某个数目字节的整数倍(如分块加密算法中要求明文是单块长度的整数倍)。填充字段的第一个功能就是将明文扩展到算法需要的长度;
2)另外 ESP 要求 ESP Header 必须是 32-bit 的整数倍,Pad Length 及 Next Header 两个字段需要靠右对齐排列,填充字段也用来保证这样的报文格式;
3)最后一个功能是处于安全性考虑的,就是填充字段可以隐藏数据载荷的实际长度,从而提供一定的保密性。填充字段的最大长度可达 255 个字节。填充内容与提供机密性的加密算法有关,如果这个算法定义了一个特定值,那么填充字段的内容就只能采用这个值。如果算法没有指定需要填充的值,ESP 就会指定填充的第一个字节的值是 1,后面的所有字节值都单向递增;

Pad Length

标明 Padding 中填充数据的长度。接收端可以根据这个字段恢复载荷数据的真实长度;

填充项长度字段是硬性规定的,因此,即使没有填充,填充长度字段仍会将它表示出来;

Next Header

表明载荷内的数据类型:
1)在隧道模式下,如果使用 ESP,这个值就会是 4,表示 IP-in-IP。如果在传输模式下使用 ESP,这个值表示的就是它背后的上一级协议的类型,比如 TCP 对应的就是 6;

Authentication Data

该字段包含数据完整性校验值 ICV(Integrity Check Value),用于接收方进行完整性校验。可选择的认证算法有 MD5、SHA1、SHA2、SM3;

用于容纳数据完整性的检验结果,通常是一个经过密钥处理的散列函数。该字段的长度由 SA 所用的身份验证算法决定。如果 SA 中没有指定认证算法,则认证数据字段将不存在;

96-bit

参考文献

The TCP/IP Guide – IPSec Encapsulating Security Payload (ESP)