TLS 基础知识 (2)

ECDH,ECDHE, RSA,ECDHA

为何要使用对称密钥? 因为对称加密的效率高。
TLS是如果实现交换对称密钥的?
TLS建立在TCP之上,建立TLS连接前需要TCP4次握手。然后进行TLS连接。在连接中要完成秘钥交换,交换算法不同,握手过程细节也会不同。总结以下曾经出现的类型。

  • 依靠事先共享的“秘密”
  • 基于密钥协商算法
    • 基于RSA
    • 基于DHE
    • 基于ECDHE

安全性而言,RSA, DHE, ECDHE 其安全性是递加的。

ECDHE

ECHDE 中的 E 代表着「短暂的」,是指交换的密钥是暂时的动态的,而不是固定的静态的。ECDH是EC是“ elliptic curves”的意思,DH是“ Diffie-Hellman”的意思。
ECDH 是椭圆曲线的笛福赫尔曼算法的变种,它其实不单单是一种加密算法,而是一种密钥协商协议,也就是说 ECDH 定义了(在某种程度上)密钥怎么样在通信双方之间生成和交换,至于使用这些密钥怎么样来进行加密完全取决通信双方。
ECDHE是ECDH的延伸, 它也是密钥协商, 只是它每次进行TLS握手时都进行密钥商(E=Ephemeral), 它比ECDH拥有更好的前向安全保证。

那么 ECDH 是这样的:
在这里插入图片描述
中间人只知道 H A H_A HA H B H_B HB 以及椭圆的公共参数,是无法算出共享密钥 S 的。

TLS流程

TLS流程基于交换和签名算法的不同而不同。这里列举有

  • ECDH_ECDSA
  • ECDH_RSA
  • ECDHE_ECDSA
  • ECDHE_RSA

ECDH_ECDSA
在ECDH_ECDSA中,服务器的证书必须包含一个支持ECDH的公钥并且可以使用ECDSA进行签名。不得发送ServerKeyExchange(服务器证书包含客户端要求达到预主密钥所需的所有必要密钥信息)。客户端在与服务器的长期公钥相同的曲线上生成ECDH密钥对,并将其公钥发送到ClientKeyExchange消息中。
客户端和服务器都执行ECDH操作并使用生成的共享密钥作为预主密钥。

ECDH_RSA
该密钥交换算法与ECDH_ECDSA相同,不同之处在于服务器的证书必须使用RSA而不是ECDSA进行签名。

ECDHE_ECDSA
在ECDHE_ECDSA中,服务器的证书必须包含一个支持ECDSA的公钥并且可以使用ECDSA进行签名。
服务器在ServerKeyExchange消息中发送其临时ECDH公钥和相应曲线的规范。 这些参数必须使用与服务器证书中的公钥对应的私钥对ECDSA进行签名。
客户端在与服务器的短暂ECDH密钥相同的曲线上生成ECDH密钥对,并在ClientKeyExchange消息中发送其公钥。

ECDHE_RSA
此密钥交换算法与ECDHE_ECDSA相同,只是服务器的证书必须包含授权签名的RSA公钥,并且必须使用相应的RSA私钥计算ServerKeyExchange消息中的签名。 服务器证书务必用RSA签名。

基于ECDHE 交换算法的TLS流程

如下图:
在这里插入图片描述
wireshark log 如下
在这里插入图片描述

流程分析

TCP 握手

在这里插入图片描述
在这里插入图片描述

Handshake: Hello

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(1).client_hello
客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:

  • 支持的最高TSL协议版本version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本;
  • 客户端支持的加密套件 cipher suites 列表, 每个加密套件对应前面 TLS 原理中的四个功能的组合:认证算法 Au (身份验证)、密钥交换算法 KeyExchange(密钥协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验);
  • 支持的压缩算法 compression methods 列表,用于后续的信息压缩传输;
  • 随机数 random_C,用于后续的密钥的生成;
  • 扩展字段 extensions,支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段作用。

在这里插入图片描述
(2).server_hello

  • server_hello, 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S 等,其中随机数用于后续的密钥协商;
    在这里插入图片描述

(3).server_certificate, server_key_exchange, server_hello_done

  • server_certificates, 服务器端配置对应的证书链,用于身份验证与密钥交换;
    证书的结构如下:
    在这里插入图片描述
    在报文中的证书链:
    在这里插入图片描述
    证书链的最后指向根证书
    在这里插入图片描述
    浏览器中查看该根证书,如下
    在这里插入图片描述
    通过浏览器中预置的根证书,通过该报文中的证书链,便能逐级认证证书的有效性。

  • server_key_exchange, 秘钥交换ECDH算法的参数

ECDHE下主要有几点重要的信息
1:指明自己使用的椭圆曲线(一般根据客户端的拓展中supported_groups中的选择椭圆曲线算法)。
2:公钥。服务器本地计算一个大数(BIGNUM),乘上曲线的base point,得到一个新的point,这个point就是公钥,用04+x+y的格式组织起来。04表示unconpressed point,和客户端的ec_point_formats有关。
3:签名。
和RSA握手不同,RSA情况下, 只要能值正常协商密钥,那么必然服务器端有证书对应的私钥,也间接表明了服务器拥有该证书。
ECDHE下,证书对应的私钥并不参与密钥协商,为了防范中间人攻击,如果要证明服务器拥有证书,则必然有签名的操作(就像双向认证的情况下,客户端需要发送certificate verify)。服务器在server_key_exchange报文段的末尾对部分报文段进行了数字签名。被签名数据从curve type起,至point的y为止。

具体签名过程为先用client_hello报文段和server_hello报文段中的2个32字节的随机数作为函数参数,利用sha256哈希算法对server_key_exchange报文段本身的载荷产生摘要,然后再用服务器的私钥和sha256哈希算法进行ECDSA数字签名,得到签名结果r和s,并写入server_key_exchange报文段的末尾。
客户机在收到server_key_exchange报文段后,先进行各数值项格式的校验,然后提取出报文段末尾的签名值r和s。之后,用已经读取出的服务器的公钥的x,y坐标值来对server_key_exchange报文段进行ECDSA签名验证,若结果和报文段中的r和s值一致,则报文段通过验证。

在这里插入图片描述
在ECDHE_ECDSA中,服务器的证书必须包含一个支持ECDSA的公钥并且可以使用ECDSA进行签名。服务器在ServerKeyExchange消息中发送其临时ECDH公钥和相应曲线的规范。 这些参数必须使用与服务器证书中的公钥对应的私钥对ECDSA进行签名。
在这里插入图片描述

  • server_hello_done,通知客户端 server_hello 信息发送结束;
生成master secret

下图中红色部分
在这里插入图片描述
在这里插入图片描述
展开看,
在这里插入图片描述
客户端验证并计算主密钥

  • 对收到的证书和签名进行验证。
  • 验证成功后向服务器发送送秘钥交换算法的参数。
  • 服务器接收到客户端的秘钥交换算法参数,开始计算master secret。先生成pre-master,根据pre-master和两个随机数算出master secret(主秘钥)。
  • 客户端也进行主秘钥的计算。之所以称为主密钥,是因为根据主密钥可生成多个会话秘钥由于不同的具体加密,如:客户端发送用的会话秘钥、服务端用的会话秘钥。
  • 目前都是明文通信,所以秘钥的生成必须很讲究,各部计算都需随机性极强的算法,保证安全性。

验证加密通信并验证

  • 至此加密通信所用的秘钥都已生成,在此之前都是明文发送。客户端通知服务器启用加密通信并加密发送之前所发信息的摘要,服务器也做一样的事,用于验证加密通信是否可行。发送的两个消息分别是“Change Cipher Spec”和“Finished”。之后就可使用加密的Http请求和响应。
  • Encrypted handshake message (encrypted finished) 是使用对称秘钥进行加密的第一个报文,如果这个报文加解密校验成功,那么就说明对称秘钥是正确的. Finished message中包含有hash值
  • New Session Ticket 客户端和服务器端第一次建立完整TLS握手后会保存本次会话的信息,待下次会话恢复用。

ECDHE_ECDSA 和 ECDHE_RSA 对比

ECDHE_ECDSA 和 ECDHE_RSA的 ServerHello 报文对比如下
在这里插入图片描述
在这里插入图片描述
ECDHE_ECDSA 和 ECDHE_RSA的证书对比如下: (公钥信息给出的支持算法)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ECDHE_ECDSA 和 ECDHE_RSA的 ServerKeyExchange 报文对比如下
在这里插入图片描述
在这里插入图片描述

ECDSA签名算法

Alice通过私钥签名一个数据,Bob可以通过Alice的公钥验证这个签名;只有通过Alice私钥计算得到的签名才能通过Alice的公钥进行验证。
首先Alice和Bob拥有相同的椭圆曲线参数,算法被签名称之为ECDSA,是DSA算法的一个变体。
ECDSA签名算法的输入是数据的哈希值,而不是数据的本身,至于哈希算法选用哪一个就取决于自己了。为了使得ECDSA的输入值的比特数和子群的阶n的比特数一样,哈希值可能会被截断。
在这里插入图片描述
我们把ECDSA输入称之为Z。Alice使用私钥da对z进行签名,生成二元组(r, s)。Bob使用Alice的公钥对(r, s)和Z进行验证。

  • k为一个范围在[1, n - 1]的随机数
  • da为Alice的私钥
  • Ha为Alice的公钥
  • 二元组(r, s)就是签名值
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值