【网络】HTTPS协议原理

HTTPS协议是什么?


HTTPS协议是应用层协议之一。
HTTPS协议是建立在HTTP协议之上,增加明文加密和解密过。

HTTPS协议浏览器对应的端口是443。

什么是"加密"?

明文:数据的原始状态。

密文:数据经过一系列变化后的内容。

密钥:中间数据,辅助完成加密和解密。

比如客户端想发送数据  5 ,在客户端和浏览器双方约定7为密钥,异或^为加密算法。


为什么要加密?

这里要先理解一个概念叫做 中间人:

指的是在进行网络通信的双方中间,分别与两端建立独立的联系,并进行数据嗅探甚至篡改的第三方。这种攻击方式使得通信的双方对中间人的存在毫不知情,误认为自己是在直接与对方通信。

比如我们会将手机开放热点,让电脑连接手机的热点,电脑是和服务器通信的,而我们的手机在这个时候就是中间人,同样连接着电脑和手机。

数据在传输的时候,必然要经过路由器、运营商服务器等多个节点,在传输的过程中,很容易中间人劫持,对数据内容篡改。为什么要篡改,当然是为了利益。


常见的加密方式

对称加密

采用单钥的加密方式,一个密钥可以同时加密和解密。

特点是:算法公开,计算量小,速度快,加密效率高

非对称加密

需要俩个密钥来加密和解密,这俩个密钥是:公开密钥私有密钥。简称公钥和私钥。

公钥:公开的,任何人都可以获取。

私钥:私有的,一般只有自己知道。

特点:速度慢。由于算法的强度复杂、安全性依赖密钥与算法,相对更安全。

公钥和私钥是配对的,如果是公钥加密,那么只能用私钥解密,

如果是私钥加密,那么只能用公钥解密。


数据指纹

指纹具有唯一性,我们可以通过指纹,区别出唯一的人。

数据指纹也叫数据摘要。利用Hash函数对信息进行运算,生成一串固定长度的数字摘要

数据摘要不是一种加密方式,因为无法利用hash函数运算后的结果恢复到原始数据。

这种数据摘要通过用来判断俩份数据是否一致,因为只要修改过数据的一个字,那么它们的数字串就不会一样。但是由于将无限的数据转化为有限长度,必然会发生数据碰撞,但是这是非常小的概率,就如同人的指纹一样,在世界上可能会重复,但是概率非常小

使用场景:
1.在一个时间段后判断数据(文件)时候被修改。如果通过遍历比对,那么就过于复杂,只需要比对俩次时间点的数据指纹。

2.在数据库中如果放用户的密码,会存在泄漏的危险。如果在第一次数据验证通过后,将密码转化为数据指纹放在数据库中,往后用户提交密码,转化成数据指纹并与数据库中的指纹比较,就能实现校验。同时又保证了密码泄漏的风险。


探求HTTPS加密的过程

要保护数据的安全,光靠post和get方法是不可靠的。

要安全,必须将明文传播转化为密文发送。

加密的方式总体上分为俩种:对称加密和非对称加密。

为了理解HTTPS加密,从历史的版本梳理在加密过程中遇到的问题,并如果解决。


方案一:只使用对称加密

通信双方各持有密钥,没有人知道,数据自然是安全的。

但是会存在致命的问题,必须提前内置大量的密钥给通信双方,既然是提前内置,那么中间人必然也能获取到密钥。同时,大量内置的密钥是非常的浪费空间。这是不可行的方案。

优化:不提前内置大量的密钥,在请求时动态生成密钥 。

动态密钥会被中间人截取!


方案二:只使用非对称加密

服务器先把公钥传给客户端,中间人也能获取公钥。

客户端请求明文用公钥加密形成密文,发送到服务器,服务器接收到密文后,私钥解密出明文。

但是如果服务器想给客户端发数据是不安全的,因为服务器是用私钥机密,公钥才能解密。而中间人已经获取到了公钥,就能解密。

因为这个方案也不安全。


方案三:双方都使用非对称加密

客户端保留公钥c ,私钥c'  。服务器保留公钥 s ,私钥s'。

建立连接时,交换它们的公钥。

客户端给服务器发消息,客户端请求+c' =明文,明文只能使用c解密。

服务器给客户端发消息,服务器请求+s'=明文,明文只能用s'解密。

而中间人无法获取双方的公钥。

但是仍然存在问题:

  • 效率慢,非对称加密的计算复杂,速度慢
  • 不安全--后面会解释。

方案四:非对称加密+对称加密

服务器持有公钥S ,私钥S',客户端和服务器建立连接时,服务器发送公钥S到客户端。

客户端动态生成密钥C。用公钥S加密 密钥C生成密文发送到服务器。

服务器通过私钥S'解密获得C。

因此它们就拿着密钥C,服务器和客户端双方就能安全的发消息了。

因为 非对称加密是用来交换密钥C的,后续的主要通信是依靠密钥C,计算速度也非常快


方案四看似很接近答案了,但是依旧不安全。如果在建立连接时,就被中间人攻击呢?

 中间人攻击

Man-in-the-MiddleAttack,简称“ MITM攻击 ”。
客户端持有密钥S'和公钥S ,中间人有私钥M'和公钥M。
在服务器和客户端握手的时候,服务器向客户端发送S,被中间人截取,替换成M。客户端接收到M。

客户端接收到伪造密钥M,形成动态密钥C,利用M加密形成密文发给服务器。

中间人截取密文,通过密钥M'解密,获取C,用S加密C发送给服务器。

从此以后,服务器获得了C,中间人也获得了C。以后的通信不再安全!

主要原因是客户端无法甄别密钥的合法性。

下一个方案就是围绕这让客户端甄别密钥。


 引入证书

要让客户端甄别密钥,就必须只权威性机构的密钥。就好比公民拥有身份证。身份证我们都认,因为是国家给我们颁发的。

服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信 息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的合法性。
证书的本质也是数据,申请人csr文件(包含个人信息,域名,公钥等),私钥自己拥有,谁都与不给。到CA机构审核。CA就给证书签名!此后,HTTPS协议,客户端只认签名后的证书。

理解签名和验证

CA机构有自己的私钥P',公钥P。CA机构将申请人提交上的.csr文件进行hash散列化,形成数据指纹。CA机构拿着自己的私钥P'对数据指纹加密,将证书和数据指纹打包好,这个过程就是签名。
服务器向客户端发起签过名的证书,客户端就必须要验证。
客户端将签名和证书分成俩部分,先将证书形成数据指纹。在利用客户端内置的CA公钥P对密文解密获取签名的数据指纹。对比这俩个散列值是否相同。
如果不同,签名无效,客户端识别到不合法的证书。

中间人能修改证书吗?

        可以,但是客户端比对证书的散列值和密文下的散列值,不相同就拒绝建立连接。

中间人可以修改数据指纹吗?
        不能。数据指纹的修改只有CA机构做得到,因为CA的密钥是私有的。

如果把证书和数据指纹全换了呢?
        也就是向CA申请一份正确的证书和签名来骗过客户端。也是行不通的,因为域名是唯一的,CA机构检查不合法。

为什么签名不直接加密,⽽是要先hash形成摘要?
        缩小密文的长度,加快速度验证。

客户端只认CA的公钥,说明必须提前在浏览器内置CA的公钥!


方案五:⾮对称加密+对称加密+证书认证

方案五就是目前主流的加密方式,即非对称加密+对称加密+证书认证。

客户端向服务器请求,服务器发送证书。客户端拿到证书后,验证(hash化+P'解密)

如果合法就随机生成密钥R,利用证书的公钥机密R,向服务器发送密文。

服务器拿着密钥解密,获取R。

之后双方就能拿着R通信。

即保证了安全性,也兼顾了效率,是可行的方案。

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度搜索

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值