欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

https - TLS 密钥交换

最编程 2024-06-26 19:45:40
...
国产数据库圈,为啥那么多水货?”

TLS密钥交换

TLS在握手时密钥的协商和交换是关键且耗时的一个步骤,密钥交换中有2个重点问题:

  • (1)密钥周期要尽可能短,密钥周期一个会话一个密钥(这个一般是不能达到的)
  • (2)密钥不能明文传输,一旦被窃听所有的努力都将白费。

既然密钥不能明文传递,那么如何确保密钥在网络传递过程中被窃取后依然无法得到真正的密钥,这里就需要使用非对称加密。它的特点是公钥加密的数据,只用私钥能解密。

基于RSA的密钥交换

  1. 服务器拥有私钥和公钥(私钥只能服务端持有),服务器把自己公钥以明文形式的发给客户端;
  2. 客户端生成一个密钥并使用公钥加密,并将加密后的密钥传递给服务端。注意:在传递的过程中即使密钥被截获,但由于无法获取私钥而不能将真正的密钥解密。也就是说,密钥只能由服务端使用私钥进行解密。
  3. 服务端获取使用公钥加密后的密钥,并使用自己的私钥对其解密得到密钥。这样就完成了密钥交换。

非对称算法是基于某个数学难题的(私钥在服务器端,公钥一般在证书中)。

  1. A对服务器B发起请求,B首先把公钥(包含在证书中)发给A(明文传输,证书是公开的)。
  2. A使用随机数算法,生成1个密钥key,并使用公钥进行加密,生成e(key),把e(key)发送到服务器B。
  3. B收到e(key),使用私钥进行解密从而得到key。 交换后,客户端和服务器都得到了密钥key(预主密钥)。

说明:B发送公钥在TLS中是通过certificate报文发送的certificate中的包含了公钥。密钥是通过Client key exchange报文发送的。

注意:

  1. 在实际TLS中,key并没有直接被当成密钥,为了描述运行过程,省去了对key后续进行KDF等操作。在TLS中,会话安全性取决于称为主密钥(master secret)的48字节共享密钥。密钥交换的目的是计算另一个值,即预主密钥(premaster secret)。这个值是组成主密钥的来源。

  2. 上面所说的证书而并非我们在百度浏览器中看到的证书。百度中的证书中包含的公钥只是用来进行身份验证的,可不是用在密钥交换里面的。

  • AES_128_GCM:用于加密
  • ECDHE_RSA:用于身份验证

基于DH类算法的密钥交换

RSA的密钥算法中最大的特点就是密钥的安全取决于私钥的安全,一旦私钥外泄,那么第三方就能从之前所有的e(key)中解密得到所有之前的key,这样就可以破解所有之前监听得到的密文。

如此A与B之前所有的保密通信都归零了。这就是所谓的不支持前向安全(forward secrecy)。

ECDHE(DHE)算法属于DH类密钥交换算法,这里的E表示临时, 私钥不参与密钥交换,即使私钥外泄,加密的报文都无法被解密,实现了前向安全(forward secrity)。由于ECDHE每条会话都重新计算一个密钥,所以当一个会话被解密后,其他会话仍旧安全。

DHE算法交换秘钥流程

临时Diffie-Hellman(ephemeral Diffie-Hellman,DHE)密钥交换是一种构造完备的算法。它的优点是支持前向保密,缺点是执行缓慢。

  1. 客户端A生成1个随机值x,使用x作为指数,即计算a = g^x mod p (g的x次方对p取模),p 是个大素数,g是生成数。客户端把 a发送至服务器,x 作为自己私钥,且只有A自己知道。

  2. 服务器B和客户端A流程一样,生成一个随机值y,用y作为指数,计算b = g^y mod p,将结果b发送至客户端,y自己保存。

  3. 客户端A收到 b 后计算key1 = b^x mod p

  4. 服务器B收到 a 后计算key2 = a^y mod p

根据数学定理 key1 = ((g^y mod p)^x )mod p = g^yx mod p key2= ((g^x mod p)^y )mod p = g^xy mod p g^xy = g^yx ,所以 key1 = key2 ,密钥交换成功,而且中间没有传输A B双方私有的 x与y , 传输的只是 p ,g ,g^x mod p , g^y mod p ,在已知这四个数的情况下是很难得出 x与y的,这是依赖于离散对数这个难题。

说明:

DHE密钥交换时并未有私钥参与进来,而密钥是被重新计算出来的,就算密钥被泄漏,之前的通信还是安全的,具有前向保密性;即使是某一次的密钥外泄(也就是 x和y外泄),那么之前的加密数据也不会遭遇危险,因为每次都生成不同的x与y。

ECDHE算法交换密钥流程

理解了DHE密钥交换,那么理解ECDHE密钥交换原理并不难。数学方面的问题不深究也能理解。就是ECDHE的运算是把DHE中模幂运算替换成了点乘运算,速度更快,想破解更难。 临时椭圆曲线Diffie-Hellman(ephemeral elliptic curve Diffie-Hellman,ECDHE)密钥交换建立在椭圆曲线加密的基础之上。椭圆曲线算法是相对较新的算法。 流程如下:

  1. 客户端A随机生成随机值a,计算F(x, y) = a * Q(x, y),将F(x, y)发送至服务器B。
  2. 服务器B随机生成随机值b,计算F(x,y) =b * Q(x, y)。将F(x, y)发送至客户端A。
  3. 客户端A计算key1(x, y) = a * (b * Q(x, y)) 。
  4. 服务器计算key2(x, y) = b *(a * Q(x, y)) 。 key1 = key2 = key,取key的x向量作为密钥(预主密钥)。 Q(x, y)为公认的某个椭圆曲线算法的基点。例如 secp256k1 与 secp384r1

ECDHE密钥交换中,椭圆曲线(例如secp256k1) 和b通过server key exchange报文发送;a通过client key exchange报文发送。

椭圆曲线参数:

[root@framework ~]# openssl ecparam -list_curves
  secp256k1 : SECG curve over a 256 bit prime field
  secp384r1 : NIST/SECG curve over a 384 bit prime field
  secp521r1 : NIST/SECG curve over a 521 bit prime field
  prime256v1: X9.62/SECG curve over a 256 bit prime field

secp256k1和prime256v1是用的比较多的。

总结

密钥交换:RSA进行密钥交换是不支持前向安全的,一旦私钥泄露,则在传输中的所有数据都是不安全的。DH、DHE、ECDHE也都是可以用于密钥交换的。其中ECDHE的速度会更快,安全性也更高。

  1. DHE:DH->算法;E->表示临时,表示每次会重新计算密钥,也就支持了前向保密,缺点就是速度比较慢。基于的数学难题就是离散对数。
  2. ECDHE:EC->椭圆曲线;DH->算法;E->表示临时,可支持前向加密
  3. ECDH:没有E,非临时,不会重新计算x和y,不支持前向加密。ECDH算法服务器端的私钥是固定的,即证书的私钥作为b,故ECDH不被认为前向安全,因为私钥泄漏相当于b泄漏,可以使用b计算出之前所有的密钥。

在密钥交换时,由服务器端生成密钥交换参数,发送给客户端。但是RSA是不需要发送密钥交换参数的。因为服务器端可以通过私钥解密出客户端发送的预主密钥再通过算法生成主密钥。整个过程无需发送额外的参数。

推荐阅读