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

HTTPS协议加密机制 #15

Open
Alexandermclean opened this issue Mar 16, 2019 · 0 comments
Open

HTTPS协议加密机制 #15

Alexandermclean opened this issue Mar 16, 2019 · 0 comments

Comments

@Alexandermclean
Copy link
Owner

1.为什么要加密

因为http的内容是明文传输的,明文数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,他还可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以我们才需要对信息进行加密。最简单容易理解的就是对称加密。

2.加密的种类

1.对称加密

通信双方各持一个相同的秘钥,对通信的内容加密解密,这种加密方式优点就是加密解密速度快,效率高。
但是怎么能保证通信的双方都拿到相同的秘钥而不被其他人拿到呢,这就很难了= =

2.非对称加密

就是有两把秘钥,一把私钥,一把公钥;用公钥加密的内容只能私钥解密,同样私钥加密的内容只能公钥解密。鉴于非对称加密的机制,我们会有这种思路:服务器先把公钥直接明文传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,这条数据的安全似乎可以保障了!因为只有服务器有相应的私钥能解开这条数据。

然而由服务器到浏览器的这条路怎么保障安全?如果服务器用它的的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它,而这个公钥是一开始通过明文传输给浏览器的,这个公钥被谁劫持到的话,他也能用该公钥解密服务器传来的信息了。所以目前似乎只能保证由浏览器向服务器传输数据时的安全性。

3.改良版的非对称加密

既然一对私钥秘钥能保证一方面的通信安全,那用两队公钥私钥就能保证互相通信安全了 : )
1.某网站拥有用于非对称加密的公钥A、私钥A’;浏览器拥有用于非对称加密的公钥B、私钥B’。
2.浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。
3.浏览器把公钥B明文传输给服务器。
4.之后浏览器向服务器传输的所有东西都用公钥A加密,服务器收到后用私钥A’解密。由于只有服务器拥有这个私钥A’可以解密,所以能保证这条数据的安全。
5.服务器向浏览器传输的所有东西都用公钥B加密,浏览器收到后用私钥B’解密。同上也可以保证这条数据的安全。

的确可以!抛开这里面仍有的漏洞不谈(下文会讲),HTTPS的加密却没使用这种方案,为什么?最主要的原因是非对称加密算法非常耗时,特别是加密解密一些较大数据的时候有些力不从心,而对称加密快很多。

4.非对称加密+对称加密

既然非对称加密耗时,非对称加密+对称加密结合可以吗?而且得尽量减少非对称加密的次数。当然是可以的,而且非对称加密、解密各只需用一次即可。
1.某网站拥有用于非对称加密的公钥A、私钥A’。
2.浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。
3.浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
4.服务器拿到后用私钥A’解密得到密钥X。
5.这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密。

但是!这样会有另一个问题,中间人劫持替换了服务器给浏览器的公钥A,换成了自己伪造的公钥B,浏览器生成的对称秘钥X用公钥B加密后被劫持,劫持者用自己的私钥B’解密得到秘钥X,用之前劫持的公钥A加密后给服务器,服务器也会得到一样的秘钥X,但这时秘钥X已经泄露了= =
因此需要一个证明,证明浏览器收到的公钥确实是需要通信的服务器给的,类似于现实中张三向李四证明自己是张三一样,张三可以出具自己的身份证给李四,证明自己是张三;但是又有个问题,我不是张三但我伪造了一个张三的身份证,我好像就变成了张三了;这个时候身份证的真伪就必须有个权威机构来证明比如公安局,在公安局证明了手上的张三的身份证是真的的时候,你就是张三了。兜了一大圈,终于证明了我就是我了。

5.数字证书(CA证书)

互联网中,CA机构就像是公安局,数字证书就是服务器的身份证,证书里包括了证书持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,证书就如身份证一样,可以证明“该公钥对应该网站”,浏览器从证书里取公钥就行了。
但证书是明文传递的,就像之前的公钥一样,因此需要一个不能伪造的标记证明CA证书的真实性;这里的解决办法和上面的token的做法差不多,CA证书除了有网站的信息的明文外,还会附带有一个由CA机构私钥加密明文内容的签名,这两者共同组成了数字证书。
数字签名的制作过程:
1.CA拥有非对称加密的私钥和公钥。
2.CA对证书明文信息进行hash。
3.对hash后的值用私钥加密,得到数字签名。

ca

浏览器验证过程:
1.拿到证书,得到明文T,数字签名S。
2.用CA机构的公钥对S解密(由于是浏览器信任的机构,所以浏览器保有它的公钥。详情见下文),得到S’。
3.用证书里说明的hash算法对明文T进行hash得到T’。
4.比较S’是否等于T’,等于则表明证书可信。

有一点,CA机构的公钥是否可信的问题,操作系统或浏览器一般会预装一些他们信任的CA机构的数字证书,也就是我们常看到的根证书,根证书则包含了该CA机构的公钥,用于浏览器和该CA机构信任的web服务器通信,类似于一个信任链,浏览器信任根证书里的公钥,发布该公钥的CA机构信任它认证的web服务器。

另外,不知你们是否遇到过网站访问不了、提示要安装证书的情况?这里安装的就是根证书。说明浏览器不认给这个网站颁发证书的机构,也就是没有该机构的根证书,你就得手动下载安装(风险自己承担 : p)。安装该机构的根证书后,你就有了它的公钥,就可以用它验证服务器发来的证书是否可信了。

6.HTTPS协议的会话保持

看完上述基于HTTPS协议加密的通信,会觉得过程很繁琐,如果每次请求在SSL/TLS层进行握手阶段,都要经历一次密钥传输过程会非常耗时,那怎么达到只传输一次呢?用session就行。
服务器会为每个浏览器(或客户端软件)维护一个session ID,在TSL握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了。

ca2

不由得感叹一句,网络安全真的很难得啊 = =

@Alexandermclean Alexandermclean added this to 什么都有 in daily record Mar 16, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
daily record
  
网络基础
Development

No branches or pull requests

1 participant