AH机制详解

来源:互联网 发布:mysql 图形化 执行计划 编辑:程序博客网 时间:2024/04/28 05:56
在 IPSec 协议实际上由两个不同的协议组成,分别是 AH (Authentication Header,鉴别首部) 和 ESP (Encapsulated Security Payload,封装安全有效载荷)。这两个协议所负责的任务和功能是不同的,这里只介绍 AH 这种机制,它的主要功能是“完整性验证”。

AH 协议是以数字签名的方法来确保数据的完整性。比如,我们可以使用 AH 来确保传输过程中的数据内容没有遭到篡改或因为传输质量不佳造成的错误。另外,AH 可以工作在 IPSec 的传输模式 和隧道模式 ,需要注意的是 AH 协议中不包含加密功能。下面分别叙述在两种模式下的工作原理。

在传输模式中
假设在传输模式中的工作框图如下:


在上图中,主机A 和 主机B 使用 AH 协议保护所传输的数据包,此时需要为两个主机设置一个“加密密钥”。假设主机A 的密钥是 Key(A) ,主机B 的密钥是 Key(B) 。注意,AH 协议使用的是“对称加密 ”。因此,我们必须把主机A 的密钥传送给主机B,而把主机B 的密钥送给主机A。实际上,如果在 Linux 上搭建这个机制的演示环境,可以通过 scp  命令传递密钥,这样能够保证密钥的安全传送。

现在假设双方都已经具备了对方的加密密钥了。下面介绍 AH协议 的工作原理。

实际上,在使用 AH协议 时,会在 TCP 包头(UDP, ICMP, OSPF 等)和 IP 包头之间添加一个 AH 包头。比如在没有使用 AH 协议之前,一个数据分组构成如下图所示:


在使用 AH协议 后,数据分组变成如下结构:


在插入这段 AH包头 后,接着就会对整个数据包进行哈希运算。事实上,在 IP 包头以及 AH 包头中会含有一些变动的数据,如 IP 包头中的 TTL 值,所以为了获得固定的哈希值,在计算之前,这些数据字段会被设置为 0。在计算后所得到的指纹会以 Key(A) 为加密密钥来进行对称加密,加密完毕后得到的结果称为验证数据,这部分验证数据也会被填入到 AH 包头中。

在主机B 收到数据包后,由于事先已经将 Key(A) 传递给了主机B,因此主机B 可以用 Key(A) 作为解密密钥,将 AH 包头中的验证数据解密,这样就可以还原得到主机A所计算出来的指纹 -- 假设该指纹为 F(A) 。再接着,主机B 也会对整个数据包进行哈希运算,然后同样得到一个指纹 -- 假设该指纹为 F(B) 。如果 F(A) == F(B) ,那么根据哈希算法的特性,我们可以确认数据包在传输过程中数据内容没有任何改变,于是数据的完整性得到了保证。

在上面的图中,我们还有一个 Key(B),因此可能会产生疑问,为什么主机A 和 主机B 个需要一个加密密钥?用一个够了不?
这是因为 IPSec 在设计时,特别把 AH 协议设计成“单向的”。也就是说,我们可以只选择主机A向主机B发送数据时使用 AH 协议,而主机B在发送数据到主机A 时可以不用 AH 协议。当然,也可以反过来设置。但是实际应用中,我们为了更安全的原因,会进行“双向”选择,即都使用 AH 协议。

AH 协议之所以被设计成单向,最大的因素在于“安全”。如果A, B 两个主机只使用一个密钥的话,那么因为加密密钥可能被他人猜中,从而会导致A 和 B 两个主机的数据都会暴露。如果主机 A 和主机B 的加密密钥是各自独立的,那么奉献就减少了一半。

通过使用 wireshark 软件,可以观察使用 AH 协议时的通信数据包如下:


如果展开 IP 包可以看到其中协议字段部分的值为 51 。这里不展开如何搭建 AH 的实验环境,但会在另一篇帖子中进行描述。

在隧道模式中也可以用 AH 协议,其工作原理和方法基本相同,区别在于数据包的构成不同。
0 0
原创粉丝点击