从前面的介绍的密码学的4个目标中,了解到业务通信过程中的加解密常常使用的是对称加密来保证加解密的效率,而这个对称加密的秘钥也不是固定不变的,而是一个动态秘钥,在每一次的会话中,秘钥均不相同。那么,这个会话秘钥,该如何在业务通信前,通信双方都能获取到该会话秘钥,将是这一篇文章的主题。
网络通信中,对称加解密采用动态秘钥,也叫作会话秘钥,秘钥的特点如下:
- 会话秘钥用途:加解密通信业务数据。
- 会话秘钥来源:是通过秘钥协商算法协商而来,且只有通信双方的客户端和服务端知晓。
- 会话秘钥生命周期:会话秘钥,顾名思义,仅用于该会话,会话建立时,协商而来的动态秘钥,无需存储,会话一旦结束,那么这个会话秘钥也就失去其存在的价值。因此,会话秘钥,仅存在于内存,极大保证通信的安全性。
常见秘钥协商算法:
- RSA秘钥协商算法
- DH秘钥协商算法
- ECDH秘钥协商算法
RSA秘钥协商算法
客户端向服务端发送连接请求后,服务端将其公钥返回给客户端,客户端生成一个会话秘钥,使用服务端提供的公钥对会话秘钥进行加密,在服务端使用私钥对其进行解密。此时,客户端和服务端均知晓会话秘钥。通信双方可以使用协商的这个会话秘钥进行业务数据对称加解密通信。
特点
- 每次连接请求,都会产生一个动态的会话秘钥。
- 协商流程简单。
缺点
- 会话秘钥由客户端决定。如果客户端生成会话秘钥时,生成的秘钥较简单,那么攻击者可以想到暴力破解,不会去直接破解RSA加密算法的私钥,而是直接暴力破解会话秘钥,反解出明文。
- 一旦服务端的私钥被泄漏,那么之前攻击者保存下来的密文,都可以通过服务端的私钥解密出会话秘钥,再使用会话秘钥解密通信数据。这就不能提供前向安全性。
DH(Diffe-Hellman)秘钥协商算法
RSA秘钥协商算法,其实会话秘钥完全有客户端决定,并没有服务端的参与,未体现出通信双方的协商过程,更像是秘钥传输。
为了避免会话秘钥由通信双方单一决定,需要通信双方共同参与协商,计算出相同的会话秘钥。
特点
- 每次连接请求,都会产生一个动态的会话秘钥。
- 会话秘钥由通信双方共同计算获得,而非单一方决定。
- 只要有一方的私钥未泄密,攻击者都无法计算获得会话秘钥。
静态DH算法(DH算法)
p、g、服务器公钥(Ys)永远固定。避免服务端频繁生成p、g,公钥,减少对CPU的开销。
缺点:服务器端的私钥泄密,加之客户端私钥泄密,不能保证前向安全性。
临时(Ephemeral)DH算法(EDH算法)
为了避免在静态DH算法中,因服务器端的私钥泄密导致的前向安全性问题。EDH算法,每次客户端连接请求时,服务器端都重新生成DH秘钥对。如此一来,就算服务端的某一次通信的私钥被泄漏,因为当次的私钥不能计算出之前会话的秘钥,因此也能保证前向安全性。
另外,在协商出会话秘钥后,客户端和服务端的私钥a和b,都可以丢弃。这就是在有限的时间、有效的空间生成了秘钥对,从而让黑客攻击变得更难,进一步提升安全性。
ECDH秘钥协商算法
为了进一步提升DH算法的安全性,避免DH的秘钥对不被破解,一种有效的方案就是,增加秘钥对的长度,但随之而来的就是,秘钥长度越长,CPU资源开销越大,计算耗时越长。因此,椭圆曲线密码学(Elliptic Curve Cryptography, ECC)应运而生。
ECDH秘钥协商算法,就是ECC和DH算法的结合组成。可以⽤更少的计算量计算出公钥,以及最终的会话密钥。比如,ECC只需224bits就能达到RSA 2048bits同样的安全水平。
ECC过于复杂,作者也未深入理解,此处暂且不论。读者只需了解,ECC为DH算法提供难于破解的公私钥对即可。