在上一章中,我们学习了http协议,了解了其层状的结构,并对其常见报头,方法,各种特性有了相关的认识。本章我们紧接着学习https这一协议。分析通信时是如何加密的,主要的策略有哪些,并了解现在主流的加密措施等。目标已经,搬好小板凳,准备开讲啦… 👉 http协议复习
在上一章节中,我们学习了http协议,我们知道http协议是具有安全隐患的,最主要的原因就是其是明文传输的!
HTTP的安全隐患主要包括以下几点:
为了解决这些问题,发展出了HTTPS(HTTP Secure)协议:
SSL/TLS
协议,通过对数据进行加密和身份验证,使得通信更加安全可靠。现在主流的已经不是http了,都是https了~
http直接使用传输层的接口套接字,http是用传输层的接口来使用网络层的协议来进行通信。构建http的response和request二进制流。数据和正文都是明文的,有人拿到了数据就能看到,不安全!!
可以选加密或者不加密,加密就是https,不加密就是http。SSL/TLS在http协议下侧,属于软件层。
同层的http协议并不关心如何加密,同层的http也不需要关心如何解密:
所有的加密,都是为了防止中间有人进行窃取和篡改!
具体解释:
SSL/TLS
加密层(也是属于应用层的),浏览器和服务端都支持。SSL/ TLS
加密解密层,对数据进行解密。这就保证了数据在中间传输过程中,一旦被截取了,也不会对数据进行篡改。
http + SSL/TLS合起来称之为https。
加密就能解决彻底解决安全问题吗?不能!单纯依靠加密是解决不了问题的!还需要一套综合的方案!
加密就是把明⽂(要传输的信息)进行一系列变换,⽣成密⽂。
解密就是把密⽂再进⾏⼀系列变换,还原成明⽂。
在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进⾏这个过程这样的数据称为密钥。
概念简述:
特征:加密和解密所用的密钥是相同的。
周边概念:
举个栗子:
x
,密钥key
。x ^ key
得到的密文y
。y
再次进行运算y ^ key
,得到的就是原来的明文x
。概念简述:
特点:算法强度复杂,安全性依赖于算法与密钥,但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。
周边概念:
非对称加密,有两个秘钥,一个密钥叫公钥, 一个密钥叫私钥。两个密钥,任何一个都能叫做公钥或私钥,选择其中某一个公开这就叫做公钥,自己保留好不让别人看到的叫做私钥。用私钥加密,公钥解密这种算法叫非对称。
举个栗子:
数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数字摘要。数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。
数据摘要只有数据加密,没有数据解密(哈希算法是不可能的),严格意义来讲不算是加密算法(因为不能解密),但是可以判断信息是否被篡改,摘要是不可能反推回原信息的。
因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据对比。
数字签名:摘要经过加密,就得到数字签名。
加密的方式有很多,但是整体可以分成两大类:对称加密和非对称加密。
如果通信双方都各自持有同一个密钥X,且没有别人知道,这两方的通信安全当然是可以被保证的(除
非密钥被破解)。
引入对称加密之后,即使数据被截获,由于黑客不知道密钥是啥,因此就无法进行解密,也就不知道请求的真实内容是啥了。
但是真的就这么简单的解决了吗?答案是否定的!
比较理想的做法,就是能在客户端和服务器建立连接的时候,双方协商确定这次的密钥是啥~
客户端如何拿到密钥?
被加密之后的密钥所形成的密文
的密钥呢?被加密之后的密钥所形成的密文
的密钥发送给客户端,那么该密钥要是被中间人截取了呢?公钥加密的密文,只能用私钥解密,私钥加密的密文,只能用公钥解密!!
非对称加密过程图:
但是服务器到浏览器的这条信道怎么保障安全?(重点)
所以,反向的从服务器单发送给客户端,这条信道是不安全的,而且暂时还没有解决方案。
加密解密过程:
公钥S
与对应的私钥S'
,客户端拥有公钥C
与对应的私钥C'
。S
对数据加密再发送,只能由服务器解密,因为只有服务器有私钥S'
。C
对数据加密再发送,只能由客户端解密,因为只有客户端有私钥C'
。这种是看似是安全的(依旧有安全问题),但是效率过于低下,是用户接受不了的。
首当其冲的我们要解决效率的问题!
公钥S
。对称密钥C
,通过公钥S
加密后发送给服务器。私钥S'
,即使截获了数据,也无法还原出对称密钥C
(其实也不一定)。私钥S
解密,还原出客户端发送的对称密钥C
,并且使用这个对称密钥C
加密给客户端返回的响应数据。后续客户端和服务器的通信都只用对称密钥C
加密即可,因为该密钥只有客户端和服务器两个主机知道,其他主机和设备即使截获数据也没有意义。
虽然上一种方案已经接近完美了,看似很安全,但是依旧存在安全问题!
方案2,方案3,方案4,都存在一个问题,如果在最开始,中间人就已经开始攻击了呢?
针对于 方案4 的问题:
重点:
客户端无法确定收到的含有公钥的数据报文,就是目标服务器发送过来的!!
针对于 方案2,方案3 的问题:
上述分析是截获客户端数据,同样的反过来中间人截获服务端数据也是一样的方式。这就是之前在讲前三个方案时括号内的备注不安全的原因。
上述四种方案都是有问题的,那么怎么样证明,收到的公钥就是合法的主机发来的呢?
证书是用来标识服务器是否合法的一种策略。
服务端在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书申请者信息,公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端请求一个服务器,会返回一个证书给客户端。
公钥S
,不叫做返回服务端公钥S
,而叫做获取服务端证书,证书是一对信息的集合。这个证书可以理解成是一个结构化的字符串,里面包含了以下信息:
证书发布机构、证书有效期、公钥、证书所有者、签名 …
签名的形成是基于非对称加密算法的,注意,目前暂时和https没有关系,不要和https中的公钥私钥搞混了。
图中的数据可以理解为证书。
当服务端申请CA证书的时候,CA机构会对该服务端进行审核,并专门为该网站形成数字签名,过程如下:
私钥A
和公钥A'
。证书明文
数据进行hash
,形成数据摘要。私钥A'
加密,得到数字签名S
。证书明文
和数字签名S
共同组成了数字证书
,这样一份数字证书
就可以颁发给服务端了。在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书,证书包含了【当前服务端的公钥】,也包含了网站的身份信息。
客户端进行认证:
验证证书是否被篡改:
hash
值(称为数据摘要),设为hash1
。hash
值,设为hash2
,对比hash1
和hash2
是否相等。CA机构将【解密数字签名的公钥】也会内置在浏览器内部或者电脑内部的。
客户端小结:
这样就能保证客户端收到的【服务器的公钥】一定是目标服务器发过来的了!!
证书验证通过后,客户端从证书中提取服务器的公钥。
客户端生成一个随机的对称密钥,并使用服务器的公钥对对称密钥进行加密。
客户端将加密后的对称密钥发送给服务器。
服务器收到客户端发送的加密对称密钥后,使用自己的私钥进行解密,得到对称密钥。
服务器和客户端之间使用对称密钥进行后续的通信,实现加密传输。
还会有安全隐患吗?
所以https是一套:非对称加密 + 对称加密 + 证书认证的机制。
为什么摘要内容在网络传输的时候一定要加密形成签名?
为什么签名不直接加密,而是要先hash形成摘要?
查看浏览器内置的证书:
TLS/SSL
连接确实是由服务器向浏览器发送证书,然后浏览器通过验证该证书来确认服务器的身份和信任。总结起来,浏览器内置证书是为了简化用户验证过程,并提供更好的用户体验。