Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

技术 / 读书 /《HTTP权威指南》/ SSL 握手原理 #32

Open
huanzhiyazi opened this issue Apr 25, 2021 · 0 comments
Open

技术 / 读书 /《HTTP权威指南》/ SSL 握手原理 #32

huanzhiyazi opened this issue Apr 25, 2021 · 0 comments

Comments

@huanzhiyazi
Copy link
Owner

huanzhiyazi commented Apr 25, 2021

1 SSL 用到的加密原理

首先关于一些加密的通用概念,在 算法导论/RSA加密原理 中已有详细总结。

SSL采用了非对称加密与对称加密相混合的方式来通信,用非对称加密完成握手,用对称加密进行握手后的会话。概括来说:

  • 用非对称加密验证通信双方或服务方的证书
  • 用非对称加密交换通信双方的随机数用于生成共享密钥
  • 用生成的共享密钥以对称加密的方式进行握手后的会话


2 SSL 握手过程

SSL 握手的关键流程如下,通信过程中携带的诸如 SSL 版本信息等非关键信息已经用其它代替:

SSL handshake

要点如下:

  • 假设 Alice 为客户端,Bob 为服务器。

  • 事先,BobCA 申请了一个服务器证书,而 BobAlice 颁发了一个客户端证书。

  • 图中的黄色部分是与客户端证书相关的流程,可以省略。只有当 Bob 有特殊要求时,比如 Bob 为银行机构,或者 Alice 作为 Bob 的内部员工时,可能会有这样的要求。

  • 握手一共分为 4 步:

    1. Alice 生成第一个随机数 Rand1,并携带 Rand1 和支持的加密算法列表向 Bob 发送 Hello。
    2. Bob 检查加密算法列表,选择一个自己支持的加密算法,然后生成第二个随机数 Rand2,携带这两项信息和服务器证书向 Alice 发送 Hello。如果需要 Alice 的客户端证书,则也需要在 Hello 中指明。
    3. Alice 验证 Bob 的服务器证书,并从证书中取出 Bob 的公钥 pBob,然后生成第三个随机数 Rand3,根据 Bob 指定的加密算法和三元组 [Rand1,Rand2,Rand3] 生成对称加密密钥 s。然后用公钥变换 P(Rand3,pBob) 加密 Rand3Alice 携带 P(Rand3,pBob)Bob 发送加密后的第三个随机数,表明 Alice 接下来将用对称加密方式加密会话信息。如果 Bob 需要客户端证书,则也必须携带。
    4. Bob 用私钥变换 S(P(Rand3,pBob),sBob) 解密第三个随机数 Rand3,根据商定的加密算法和三元组 [Rand1,Rand2,Rand3] 生成对称加密密钥 s。如果需要验证客户端证书,则验证之。最后,BobAlice 回送一个通知,表明接下来 Bob 将用对称加密方式加密会话信息。
  • 握手完成后,AliceBob 接下来的所有会话信息都将通过各自计算出的共享密钥 s 进行加密。



3 用混合加密的原因

  • 不用纯对称加密的原因:如果全程对称加密,需要双方事先都记住密钥,复杂度高;若明文先商定密钥,则密钥容易被窃取。
  • 不用纯非对称加密的原因:非对称加密的计算时间复杂度高,性能不可保证。
  • 混合加密的基本原理是:用非对称加密交换对称加密中计算密钥的随机数参数,这样既保证在会话中密钥不会被窃取,因为是各自计算出来的,又保证了在之后的会话中的性能要求。另外,用公钥加密之后的随机数,即便窃听者窃取了公钥,因为不知道私钥,所以无法破解第三个随机数,即无法破解随后的对称加密密钥。


HTTP权威指南 / 第14章 安全HTTP

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant