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,计算速度也非常快。
方案四看似很接近答案了,但是依旧不安全。如果在建立连接时,就被中间人攻击呢?
中间人攻击
客户端接收到伪造密钥M,形成动态密钥C,利用M加密形成密文发给服务器。
中间人截取密文,通过密钥M'解密,获取C,用S加密C发送给服务器。
从此以后,服务器获得了C,中间人也获得了C。以后的通信不再安全!
主要原因是客户端无法甄别密钥的合法性。
下一个方案就是围绕这让客户端甄别密钥。
引入证书
要让客户端甄别密钥,就必须只权威性机构的密钥。就好比公民拥有身份证。身份证我们都认,因为是国家给我们颁发的。
理解签名和验证
中间人能修改证书吗?
可以,但是客户端比对证书的散列值和密文下的散列值,不相同就拒绝建立连接。
中间人可以修改数据指纹吗?
不能。数据指纹的修改只有CA机构做得到,因为CA的密钥是私有的。
如果把证书和数据指纹全换了呢?
也就是向CA申请一份正确的证书和签名来骗过客户端。也是行不通的,因为域名是唯一的,CA机构检查不合法。
为什么签名不直接加密,⽽是要先hash形成摘要?
缩小密文的长度,加快速度验证。
客户端只认CA的公钥,说明必须提前在浏览器内置CA的公钥!
方案五:⾮对称加密+对称加密+证书认证
方案五就是目前主流的加密方式,即非对称加密+对称加密+证书认证。
客户端向服务器请求,服务器发送证书。客户端拿到证书后,验证(hash化+P'解密)
如果合法就随机生成密钥R,利用证书的公钥机密R,向服务器发送密文。
服务器拿着密钥解密,获取R。
之后双方就能拿着R通信。
即保证了安全性,也兼顾了效率,是可行的方案。