我不是生产者,我只是个搬运工
1.HTTP和HTTPS的区别与联系:
- 二者都是网络传输协议,https是http的升级版、安全版,https是在http基础上进行加密的。
- 连接方式不同:http的连接很简单,是无状态的;https 协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- http是超文本传输协议,信息是明文传输;https则是具有安全性的ssl加密传输协议。
- http的端口是80;https的端口是443。
- https需要ca证书申请,一般免费证书较少,因而需要一定费用(证书其实就是一对公钥和私钥)。
2. HTTPS的加密过程
HTTPS加密过程
- 客户端发起HTTPS请求
- 用户在浏览器里输入一个HTTPS网址,然后连接到服务端的443端口。
- 服务端的配置
- 采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。证书其实就是一对公钥和私钥。
- 如果对公钥不太理解,可以想象成一把钥匙和一个锁头,只是世界上只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
- 给客户端传送证书
- 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
-
【避免篡改】
用哈希算法对报文提取定长摘要;用私钥对摘要进行加密,作为数字签名;将数字签名附加到报文末尾发送给客户端;
- 客户端解析证书
-
【避免篡改】
用公钥对服务器的数字签名进行解密;用同样的算法重新计算出报文的数字签名;比较解密后的签名与自己计算的签名是否一致,如果不一致,说明数据被篡改过;如果发现异常,则会弹出一个警示框,提示证书存在的问题。 - 如果证书没有问题,那么就生成一个随机值。然后用证书(也就是【公钥】)对这个【随机值进行加密】。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
-
- 给服务端传送加密信息
- 传送的是用证书加密后的随机值,目的是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个【随机值来进行加密解密】了。
- 服务端解密信息
- 服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该随机值进行对称加密,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
- 传输给客户端加密后的信息
- 服务端用私钥加密后的信息,可以在客户端用随机值解密还原。
- 客户端解密信息
- 客户端用之前生产的私钥解密服务端传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
【个人理解】:
- 客户端请求https,服务端返回证书公钥,同时将通过哈希计算的定长报文进行私钥加密可以生成的数字签名返回。
- 客户端进行公钥认证,然后通过解密数字签名与重新计算报文的数字签名进行对比,看发送的数据是否被篡改。若验证通过,则生成随机值使用公钥加密发送给服务端。
- 服务端使用私钥解密出随机值,再把要发送的内容使用随机值加密发送给客户端
- 客户端再使用随机值解密,得到服务端发送的内容。
【公钥】:就是传给客户端的证书,让其加密内容传给服务端得到数据,而这个数据内容就是随机值。
【随机值】:就充当了一个密钥的作用,进行客户端和服务端的加密解密的工作,来保证数据的安全性。
3.HTTPS如何解决HTTP存在的缺点
(1) 如何防止窃听
- HTTP的一个缺陷就是明文传输,数据包被别人捕获之后就可获取其中的信息。但经过HTTPS传输的数据是经过加密的,而解密用的秘钥是经过双方协商的一次性秘钥,只有通信双方持有。所以其他人即使抓到了HTTPS数据包,也无法看到其中的内容,从而起到防止窃听的作用。
(2) 如何防止伪装
- 非对称加密方式存在的问题:就是无法证明公开密钥本身就是货真价实的公开密钥。HTTPS通过
数字证书认证
的方式防止伪装。
(3) 如何识别内容已被篡改
- 网络传输过程中需要经过很多中间节点,虽然数据无法被解密,但可能被篡改。HTTPS通过
校验数字签名
来识别内容是否被篡改。
(4)什么是数字签名
- 所谓数字签名,就是对报文进行散列算出的数字摘要。即:明文 -> 散列运算 -> 摘要 -> 私钥加密 -> 数字签名
(5) 怎么校验数字签名
-
服务器在发送报文之前做了3件的事:
- 用哈希算法对报文提取定长摘要;
- 用私钥对摘要进行加密,作为数字签名;
- 将数字签名附加到报文末尾发送给客户端;
-
客户端接收到报文后:
- 用公钥对服务器的数字签名进行解密;
- 用同样的算法重新计算出报文的数字签名;
- 比较解密后的签名与自己计算的签名是否一致,如果不一致,说明数据被篡改过;
参考链接:https://juejin.im/post/5db0652451882564793a4906
参考链接:https://juejin.im/post/5a4f4884518825732b19a3ce
网友评论