让我们来回顾一下三种密钥协议,第一种是认证协议,它的目的只是确认对方是不是合法身份;第二种是密钥建立协议,它的目的只是实现会话密钥的共享,没有考虑对方的身份是否合法。而本文要介绍的是第三种——认证的密钥建立协议。
一、什么是认证的密钥建立协议?
所谓认证的密钥建立协议,就是将认证和密钥建立结合在一起的协议,使得Alice和Bob确信他们正在与可信赖的对方进行保密通信。即验证了对方身份的合法性又建立了彼此用于通信的会话密钥。
所以在实际应用中,认证的密钥建立协议通常包含以下关键步骤:
- 身份验证:通信双方相互验证对方的身份。这可以通过数字证书、预共享密钥、公钥基础设施(PKI)或其他认证机制来实现。
- 密钥协商:在身份验证成功后,双方协商出一个会话密钥。这通常涉及随机数交换、密钥派生函数(KDF)或其他密钥协商算法。
- 密钥确认:双方确认协商出的会话密钥是一致的,并且没有被篡改。这可以通过消息认证码(MAC)、哈希函数或其他完整性保护机制来实现。
【注】密钥建立 = 密钥协商 + 密钥确认
二、具体有哪些认证的密钥建立协议?
协议各有特点,在不同的场景下有着不同的适用性和安全性考量。例如,Kerberos被广泛应用于企业网络环境中,而EKE则更适用于需要高度安全性的场景,尤其是在密码可能较弱的情况下。下面我们逐一介绍:
(1)大嘴青蛙协议(单钥)
步骤:
- 初始化: Alice 和 Bob 分别与 TTP (可信第三方)交换密钥
- 请求会话: Alice 请求与 Bob 建立连接,向 TTP 发送一个请求,包含 Alice 的身份标识A,使用加密Alice向对话的对象Bob的身份标识B和会话密钥K
- 转发: TTP 用 Bob和他事先共享的密钥 进行加密,发送给Bob加密好的内容,包含期望与Bob建立会话的对象标识符A,双方的会话密钥K,以及时间戳
- 完成: Bob 收到密文后,用他的密钥解密得到 K,现在 Alice 和 Bob 拥有相同的会话密钥 K
【注】大嘴青蛙协议有很多的安全隐患。
(2)Yahalom协议(单钥)
Yahalom 协议与大嘴青蛙协议非常相似,因此步骤基本相同,主要区别在于协议设计时的细节处理上。
步骤:
- 初始化: Alice 和 Bob 分别与 TTP 交换密钥
- 发起挑战: Alice 向 Bob 发送一个挑战值,同时附上 Alice 的身份标识A。
- 请求会话: Bob向TTP发送请求会话信息,包含Bob的身份标识B,用与 Bob与TTP的会话密钥加密Bob请求对话的对象Alice的身份标识A,和先前Alice发来的挑战值,以及Bob自己生成的挑战值
- 生成密钥: TTP 生成一个临时密钥 K,并用与 Alice 的会话密钥加密 K,和Bob的身份标识B,和双方的挑战值,发送给 Alice。再用与Bob的会话密钥加密K和Alice的身份标识A
- 确认: Alice 使用 解密得到K,并验证与之前发给Bob的是否相同。然后将TTP发来的转发给Bob,并相应挑战
- 确认: Bob 收到密文后,用他的解密得到 K,然后用 K 解密得到,并验证是否与自己生成的相同
- 完成: 现在 Alice 和 Bob 拥有相同的会话密钥 K
(3)Kerberos协议(单钥)
Kerberos协议引入了时间戳和有效期,实现了抗重放攻击。Kerberos协议非常常见,是重点理解对象。
步骤:
- 初始化: Alice 和 Bob 分别与 TTP 交换密钥
- 请求密钥: Alice向TTP发送会话请求,包括会话双方的身份标识A,B
- 响应: TTP分别用双方实现共享给TTP的密钥生成两份密文,密文中包含会话密钥K和身份标识,和时间戳与有效期,把两份密文都发送给Alice
- 转发: Alice解密第一份消息得到K,然后向Bob发送用K加密附带时间戳的自己的身份A,第二份密文直接转发给Bob
- 确认:Bob对第二份收到的消息解密,得到会话密钥K和时间戳,然后Bob将时间戳加一,采用K加密后发给Alice
- 确认:Alice对收到的消息用K解密出运算后的时间戳,验证其正确性。