目录
一、https协议的概念
二、加密的概念
三、为什么需要加密
四、常见的加密方式
1. 对称加密
2. 非对称加密
五、数据摘要(数据指纹)
六、数据签名
七、加密方案
1. 方案一:只使用对称加密
2. 方案二:只使用非对称加密
3. 方案三:双方都使用非对称加密
4. 方案四:同时使用对称加密和非对称加密
5. 中间人攻击(MITM攻击)
6. CA证书
6.1 CA认证
6.2 CA证书中的数据签名
6.3 客户端中的CA证书检验机制
6.4 浏览器中的CA证书
7. 方案五:非对称加密 + 对称加密 + CA证书
8. https中的三组密钥
八、如何成为中间人
1. ARP欺骗
2. ICMP攻击
一、https协议的概念
https协议在整体上其实和http协议没什么差别。但是在上一篇文章http协议中说过,http协议中传输的所有数据信息都是以明文的形式传输的,这一点我们用自己打印请求内容和用fiddler抓取请求都验证过了,无论是采用GET还是POST传输方式,都是以明文的形式传递的。而我们的请求在网络传输的过程中,也是可能被其他人抓取的,这就势必存在严重的数据安全问题。基于http的网络完全问题,便有了https协议。
https也是一个应用层协议,只是在http协议的基础上引入了一个加密层。大家要注意,有了https之后,并不代表就不使用http了,https的本质仅仅是在http上多加了一个软件层用于加密解密。
区别可以看成上图所示。当采用http协议时,就是直接从应用层向下走通过网络传输到另一台主机的应用层。当采用https协议时,就是从http中再走一层加密层加密,就是上图中的ssl/tls,向下走通过网络传输到另一台主机的应用层中,在传输进去的时候,要再走一次加密层解密,然后再到http中解析。
此时有人就可能会奇怪,既然http和https的区别是是否要经过加密层,那接收数据的另一台主机如何区分传过来的数据是否需要解密呢?其实很简单,http和https所采用的端口号是不同的。http在网络中采用的port默认是80,而https在网络中采用的port默认是443。通过端口号的不同,就可以进行不同的处理。
对于https大家如果不是学习网络安全或做网络加密算法的,大致了解这么多就可以了,不必过多深入。
二、加密的概念
加密就是把明文(要传输的数据)进行一系列变换,生成密文。
解密则是把密文经过一系列变换,还原成明文。
在这个加密和解密的过程中,往往需要一个或者多个中间的数据来辅助加密解密过程,这样的数据称谓“密钥”。
举一个例子,假设现在有数据a = 1。我们要将这个数据传输给另一台主机,但是我们不想以明文的方式传输,因此我们用一个数据key = 2,将这两个值进行异或得到数据b为a ^ key = 3。于是我们将数据b传输给另一台主机,而另一台主机中也有一个key = 2,于是它就拿着这个key和b异或,得到数据c为b ^ key = 1。通过这种方式,数据在传输的过程中就不是以明文方式传输,而是以密文方式传输了。
在上面的例子中,a就是要传输的原始数据,key就是密钥,b则是加密后的密文,c则是经过解密后的数据。
虽然加密解密从很早开始就已经存在了,例如古代的密折,其实就是一种加密解密的方法。但是加密解密真正形成密码学这一学科,是在20世纪才形成的。奠基人是英国的艾伦·麦席森·图灵。
对于这个名字大家可能不熟,但它名字中的图灵想必大家都有所耳闻,现在ai测试中的图灵实验,其实就是他提出的。
加密解密作为一门密码学这一复杂困难的学科中的核心,里面涉及到非常多的数学计算,大家如果不是未来想向这方面发展,就不比过多深究,了解一下其原理即可。
三、为什么需要加密
加密其实就是为了保护数据的安全。例如臭名昭著的“运营商劫持”。
运营商劫持分为DNS劫持、http劫持和https劫持。这里简单介绍一下http劫持。
由于我们的数据都是通过网络传输的,这就意味着所有数据包都需要经过运营商的网络设备(路由器、交换机等),此时运营商的网络设备机就可以解析出你传输的数据内容,并对里面的内容进行篡改。
例如我们要下载软件a,在下载时明明下载链接都是正确的,但是当点击下载后却是下载软件b,这可能就是发生了运营商劫持。因为你浏览器中在下载软件时,其实就是向服务器发送一个http请求,而服务器的响应中就包含了软件a的下载链接。运营商劫持之后,就会解析这个响应,发现里面的内容是下载软件a,此时它就可能会将软件a的下载链接替换为软件b。通过这种方式,用户就会下载到错误的软件。
而通过加密,就可以让中间人难以破解其中的内容进行替换,以保护数据安全。
大家要知道,如果大家想上网,无论你是个人、学校还是企业,只要是想与外部网络进行连接,就必须要进入运营商的网络中,因为所有的网络相关基础设施都是由运营商搭建维护的。因此,运营商劫持其实是一种非常恶劣的事件。也因此,运营商并不能由私企充当,而必须是国企,受到国家和政府的监管。
运营商劫持只是原因之一。另一个原因就是,运营商在网络方面其实可以看成是垄断的。而网络又是当代的必需品,如果运营商由私企充当,就会导致企业为了牟取暴利而提高人们使用网络的成本,例如提高流量价格。正因当前的三大运营商是由国家监管的,所以其流量价格也是在随着国家控制和网络的发展与完善而逐年降低,让大众能够随意使用网络而无需担心流量价格问题。
当然,数据在网络传输中会经过许多的节点,例如路由器、wifi热点、代理服务器等等。这些节点有些属于运营商,有些则属于其他人或团体。如果信息在通过这些中间节点的时候被劫持,那么传输的内容就完全暴露了。劫持者可以在通信双方没有察觉的情况下篡改数据。这就是“中间人攻击”。因此,除了运营商外,其他的黑客也是可以通过类似的手段进行劫持,获取乃至篡改用户数据。为了防范这类攻击,才需要对数据进行加密。
因此,大家在户外的时候也最好不要随意连接一些免费且没有密码的wifi,这些wifi很可能就是他人的钓鱼wifi,你连接后你在手机上通过网络传输数据时就需要经过这个wifi,此时他人就可以劫持你的数据,向你的手机中发送一些不好的东西。
四、常见的加密方式
1. 对称加密
对称加密采用单钥密码系统的加密方法,即同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称单密钥加密。
特征:加密和解密所用的密钥是相同的。
常见的对称加密算法:DES、3DES、AES、Blowfish、RC2等。
特点:算法公开、计算量小、加密速度快、加密效率高。
简单来讲,对称加密其实就是使用同一个密钥,将明文加密成密文,然后再将密文解密成明文。
2. 非对称加密
非对称加密需要两个密钥来进行加密和解密,这两个密钥 分别是公开密钥(public key,简称“公钥”)和私有密钥(private key,简称私钥)。公钥和密钥是两个不同的密钥。
常见的非对称加密算法:RSA、DSA、ECDSA。
特点:算法强度复杂,安全性依赖于算法和密钥,但是由于算法复杂, 从而使得加密解密的速度密钥对称加密解密速度快。
在非对称加密中,公钥和私钥是配对的,这也就意味着你既可以用公钥对数据加密,私钥对数据解密;也可以用私钥对数据加密,公钥对数据解密。这一点是很重要的,在加密方案中就利用了这一特性。
非对称加密最大的缺点就是运算速度非常慢,远低于对称加密。有人此时就可能有疑惑了,既然非对称加密的速度远低于对称加密,为什么不直接使用对称加密呢?这其实是因为非对称加密在加密方案中有着不可取代的地位。
五、数据摘要(数据指纹)
数据摘要(数据指纹),其基本原理是利用单向散列函数(hash函数)对信息进行计算,生成一串固定长度的数据摘要。数据摘要并不是一种加密机制,而是用来判断数据是否被篡改的。
数据摘要常见算法:MD5、SHA1,、SHA256、SHA 512等。对于hash算法,我们都知道,它会对数据进行映射,可以将无限的数据映射成有限的数据,因此可能会出现碰撞(即两个不同的信息算出的摘要相同。但这种概率是非常低的)。
数据摘要特征:数据摘要因为是通过hash映射,这就意味着它在严格意义上并不是加密,因为它没有解密。
通过hash映射后每份不同的数据形成的数据摘要差别都是非常大的。同时从数据摘要中反推原信息也几乎是不可能做到的,即hash映射后的数据摘要是不可逆的。因此,数据摘要通常是用于对比原数据是否被修改过,而非用于加密。
当然,数据摘要有时可会用于对比资源是否相同。例如,假设a在百度网盘中上传了一部电影,此时b也向百度网盘中传入了同一部电影,a和b的电影资源都是从一个地方获得的,电影数据完全一样。如果百度网盘中又有很多人都上传这同一部一模一样的电影,那么百度网盘中就会存在大量的相同资源。无疑是非常浪费空间的。此时就可以采用数据摘要的方法,用hash映射这部电影的数据,映射完成后就到服务器维护的数据摘要中对比有没有相同的数据摘要,如果有,就保存;如果没有,就不保存,然后在你的网盘中保存一个软链接或者其他可以找到该部电影的数据。当你想要在网盘中下载这部电影时,就是拿着网盘中保存的这份链接去对应的位置拉取数据。通过这种方法,就可以避免保存大量的重复资源导致空间浪费。
六、数据签名
数据签名,其实就是数据摘要经过加密后得到的数据。那为什么要对数据摘要进行加密呢?原因很简单,虽然上文中说了数据摘要是不可逆的,是无法反推出原数据的。但是虽然无法反推,但不代表不可以穷举。例如大家的账号和密码经过数据摘要后虽然其他人无法反推,但是由于账号和密码一般也就几位、十几位,这就意味着他人可以通过穷举账号和密码并通过同样的hash算法将其与数据摘要进行比对进而得到原数据。
由此,数据摘要在网络中传输时也是需要加密的。当数据摘要经过加密后形成的密文,就叫做“数据签名”。
七、加密方案
在网络安全中,主要需要解决两个问题,第一个就是“数据被监听”。有些人可能会监听你的数据,他什么都不干,但就是一直看着你的数据传输,看你传输的数据的内容。第二个就是“数据被篡改”。防止有人非法获取你的数据并修改里面的内容。由此,针对这两个问题,就有如下的几个方案。
1. 方案一:只使用对称加密
使用对称加密,就是通信双方各持有一个密钥,这两个秘钥都是相同的。发送端在发送数据时将数据通过密钥加密,接收端接收到数据后再用密钥进行解密。
通过对称加密的方式,就能够轻松的将数据在双方进行加密和解密。这样看似乎对称加密没有问题,但是大家要知道,一台服务器在运行后,会有大量的客户端接入,这些客户端传输数据时都需要使用不同的密钥,因为如果统一使用一个密钥,那么这个密钥就很容易扩散进而被他人破解。因此在服务器中,每个用户使用的密钥可能是不一样的,服务器也就需要维护每个客户端与每个密钥之间的关系。
既然每个客户端用的都是不同的密钥,那么服务器怎么知道客户端传输过来的密钥是什么呢?因此,客户端在传输数据时,就需要连带着自己的密钥一起传给服务器。
这就很扯了,数据加密就是为了不让他人轻易看到用户的数据,如果以明文的形式将密钥传输给服务器,那这次加密不就是掩耳盗铃么。而如果以密文方式传输给服务器,那服务器就也需要知道对密钥进行加密的密钥,这就陷入死循环了,因此,只使用对称加密是无法完成加密的。
由此,在进行正常的加密数据通信之前,首先就需要解决如何让密钥被对方安全收到的问题。
2. 方案二:只使用非对称加密
使用非对称加密的方案很简单。当客户端向服务器发起请求后,服务器会自动生成一份公钥和私钥,服务器将公钥响应给客户端,客户端再用这份公钥对数据进行加密然后传输给服务器。通过这种方式,就算有人获取到了公钥也没有用,因为数据的解密必须使用私钥,而私钥保存在服务器内,他人无法获取。
这样来看,似乎保证了客户端向服务器传输数据的安全。但是服务器向客户端返回数据呢?当服务器向客户端返回数据时,如果服务器使用公钥加密,那么服务器就需要将私钥也一起传递给客户端,这就陷入了方案一的死循环问题。而如果服务器用私钥加密,由于非对称加密的公钥可以用于对用私钥加密后的数据解密,而此时公钥已经暴露在网络中了,这就会导致他人可以直接用获取到的公钥解密,从而让数据加密失效。
由此,只使用一对非对称加密的方案也是不可行的。
3. 方案三:双方都使用非对称加密
既然只使用一套非对称加密无法满足需求,那就尝试使用两套非对称加密。
客户端和服务器都各自拥有一套非对称加密的公钥和私钥,在进行通信的时候,客户端先向服务器发送请求,并将自己的公钥发送给服务器;服务器接收请求后,将服务器的公钥返回给客户端。由此,客户端和服务器就同时拥有了对方的公钥,在进行网络通信时,就直接用公钥加密数据,就算其他人获取到了公钥也没事,因为用公钥加密后的数据只能使用私钥解密,通过这种方式,就保护了数据在网络通信中的安全。
诚然,上面的这种方法确实能保证客户端与服务器交换数据时的数据安全,但是大家知道,非对称加密的速度是很慢的,这里还使用了两个非对称加密,其速度会变得非常慢,这是用户所无法接受的。因此,需要对这个方案进行优化。
4. 方案四:同时使用对称加密和非对称加密
在这个方案中,我们可以让服务器中生成一对非对称密钥。当客户端向服务器发起请求后,服务器就将自己的公钥返回给客户端。客户端此时就可以生成对称密钥,然后客户端使用服务器返回的公钥对对称密钥加密。当需要传输数据时,就用对称密钥加密数据,然后在传输数据时就将数据和加密后的对称密钥发送给服务器。服务器接收到数据后,首先用私钥解密出对称密钥,然后再用对称密钥解密数据。
通过这种方式,就只需要在进行第一次通信的时候使用公钥加密对称密钥,在后续的通信中就只需要使用对称密钥加密数据而无需再使用非对称加密,效率大大提升。
通过这种方式,就实现了一个安全又高效的加密方案了。
5. 中间人攻击(MITM攻击)
通过对方案的层层推进,我们终于得到了方案四这一既安全又高效的加密方案了。但是,这个方案真的安全吗?在上面的所有方案中,其实我们都是假设了在交换密钥时不会有中间人干扰这一理想情况的。
那么如果出现这种情况:中间人在客户端与服务器通信之前就已经存在了呢?
假设在客户端向服务端发起请求之前,中间人就已经存在,当客户端向服务器发起请求时,它什么都不做;当服务器向客户端返回数据时,中间人就开始干事了。此时中间人为了应对加密解密这一问题,它就可以事先准备好一套密钥,当服务器返回的公钥经过中间人时,它就将服务器返回的公钥保存起来,然后将公钥替换为自己准备的密钥将其传递给客户端。客户端此时没有察觉公钥已经被替换,于是继续用自己的对称密钥加密数据并用已经被替换的公钥加密对称密钥。当做完这一切后,客户端再将自己的数据返回给服务器,此时中间人劫持这段数据,用自己的密钥对客户端加密后的密钥解密进而获得了对称密钥,再用这份对称密钥解密数据,进而就获得了这份数据。当获取完成后,中间人再将这份数据重新用对称密钥加密,并用自己保存的服务器的公钥对对称密钥加密,然后传输给服务器。
通过如上方式,中间人就可以神不知鬼不觉的通过掉包服务器的公钥的方式,获取双方通信的数据了。也就是说,通过中间人攻击,无论是上面的哪种安全方案,都存在严重的安全问题。
在上面的问题中,其根本原因就是服务器返回公钥的时候公钥被中间人替换了,并且客户端并没有辨别公钥是否合法的能力。既然如此,我们能不能想一个办法让客户端拥有辨别公钥是否合法的能力呢?答案是可以的,实现方式就是“CA证书”。
6. CA证书
6.1 CA认证
服务端在使用https之前,必须向CA机构申领一份数字证书,数字证书中含有证书申请者信息、公钥信息等。这个数字证书就是CA证书。服务器在使用https之后,需要把证书传输给浏览器,浏览器从证书里获取公钥就行了。证书就好比是网络中的身份证,证明服务端公钥的权威性和合法性。
要获得CA证书,首先需要由公司的相关人员准备相应的资料,包括要使用的公钥、申请者信息、申请的域名等等内容。相关资料准备好后,就可以将资料提交给CA机构进行审核,如果CA机构审核通过,就会签发CA证书。
CA证书一般由“数据签名”和“正文”两部分构成。有了CA证书后,在未来的数据通信中,服务器除了要将加密后的数据发送给客户端,还需要将CA证书发送给客户端,客户端在接收到数据后首先就需要验证CA证书是否合法,如果非法就丢弃传输过来的数据。
大家在以前可能访问过一些奇怪的网站,在访问这些网站时就可能会弹出证书不可信任或证书已过期,它们所说的证书其实就是这个CA证书。
注意,大家不要错误的认为每次通信时都需要完整的做上面的步骤。CA证书申请后一般是有有效期的,只要在有效期内就可以随意使用这个CA证书无需重新申请,只有过了有效期才需要重新申请。
6.2 CA证书中的数据签名
上文中说了,CA证书由数据签名和正文构成。正文很好理解,因为这个证书中需要包含关于该证书的相关信息和用于服务器与客户端数据加密的公钥。那为什么要存在数据签名呢?
在上文中说过,数据签名其实就是对数据摘要进行加密后得到的数据。注意,数据签名的形成是基于非对称加密算法的,和https中的公钥和密钥是不同的。
大家首要先知道,CA机构中为了签发证书,存在一对非对称加密密钥。这对密钥中的私钥只有CA机构知道。当签发CA证书和形成数据签名时,首先是对CA证书中的正文通过hash函数形成数据摘要。然后再通过CA机构中的私钥进行加密进而形成数据签名。这份数据签名是写在CA证书上的。
在这个过程中有一个很重要的点,那就是我们使用了CA机构的私钥形成的数据签名,所以只有CA机构才能形成可信任的证书。
有人此时就可能有疑惑了,为什么CA证书中要有数据签名呢?它有什么作用呢?数据签名的作用其实并不在防止他人查看上,而是在确认CA证书是否被修改。
如果数据摘要不用私钥加密形成数据签名,那么中间人在修改CA证书后再修改数据摘要不就好了么,数据摘要没有任何意义。由此需要使用数据签名来防止有中间人篡改CA证书。
此时大家可能又有一个问题,既然数据签名是为了防篡改,那为什么要形成数据摘要后再形成数据签名,而不直接对数据加密形成数据签名呢?其实这是为了提高效率。因为数据签名是使用的非对称加密算法,而它的加密效率是很低的,如果不形成数据摘要后再加密,就势必会导致需要对一份很长的数据进行加密,非常耗时。而用hash算法形成数据摘要可以将数据长度控制在某个范围内,使得需要计算的数据变少,提高加密效率。
6.3 客户端中的CA证书检验机制
了解了CA证书和CA证书中的数据签名后,我们再来看看客户端中是如何检验CA证书是否合法的。在这之前大家要先知道两个东西,第一个就是CA机构中用于形成数据摘要的hash算法是公开的,任何人都可以使用;第二个就是CA机构会在所有的浏览器中内置自己的公钥。
当服务器的数据传输给客户端后,客户端就需要验证CA证书是否合法。验证方法分为两步,第一步是对CA证书中的正文通过使用与CA机构中相同的hash函数得到数据摘要;第二步是用浏览器中内置的CA机构的公钥解密数据签名获得数据摘要,然后将这两份数据摘要进行对比,如果相同就说明合法,可以使用CA证书中携带的服务器的公钥进行加密;如果不相同就说明非法,CA证书遭到修改,发出警报。
通过这种方法,就防止了有人替换CA证书中的公钥。因为如果替换CA证书中的公钥,就会导致CA证书的正文被修改,这份正文到了客户端形成数据摘要后,就会被检测到与数据签名中保存的数据摘要不同,进而识别出CA证书被篡改。
同时因为CA证书中的数据签名只能使用CA机构的私钥加密形成,这就意味着其他人无法用CA机构的私钥去形成一份正确的数据签名去替换CA证书中的数据签名。就算有人恼羞成怒随便用一个密钥弄了一份数据签名来替换CA证书中的数据签名,当这份CA证书到了客户端后,客户端无法用CA机构的公钥解密出正确的数据摘要,依然会被识别出CA证书被篡改。
既然局部性修改CA证书无法成功,那能不能整体替换CA证书呢?即形成一份假的CA证书去替换真的CA证书。
大家要知道,CA证书中的数据签名只能由CA机构的私钥形成,就这一条限制就要求用于替换的CA证书必须真的CA证书,否则浏览器就无法用内置的CA机构的公钥解密出正确的数据摘要。而要形成一份真的CA证书就需要拿着对应的资料到CA机构去申请。如果用一份从CA机构中申请到的真的CA证书确实可以成功替换其他人的CA证书,但是不要忘记,CA证书上是客户端要通信的服务器的域名的,而每个网站的域名都是不同的。在客户端中要发送数据时一旦比对CA证书中的域名和客户端要通信的服务器的域名就会发现这份CA证书有问题。并且这份CA证书中是需要有申请人的信息的,如果有人真这样做了,企业一旦发现这类问题,就可以直接根据CA证书上的信息找到对方,得不偿失。
6.4 浏览器中的CA证书
大家也可以在自己的浏览器中查看CA证书。打开浏览器中的设置,找到隐私与安全一栏,里面就有管理证书一栏:
点击去就可以看到浏览器中保存的各类证书:
随便选一个双击并查看详细信息:
里面就有关于这个证书的各类内容。
7. 方案五:非对称加密 + 对称加密 + CA证书
了解了CA证书后,就可以得出可行的加密方案了,即非对称加密 + 对称加密 + CA证书。该方案和方案四是一样的,只不过是将在每次传输中多添加一份CA证书并将第一次建立通信时服务器传给浏览器的公钥替换为CA证书。
在客户端与服务器建立连接的时候,服务器给客户端返回一份CA证书,客户端接收到CA证书后就对其进行验证,验证通过后才会采用CA证书中包含的服务器的公钥对客户端形成的对称密钥进行加密并将用对称公钥加密后的数据一并传输给客户端。
8. https中的三组密钥
通过上文的内容,大家就应该知道https中存在三组密钥。
第一组是CA机构的非对称密钥,私钥用于加密CA证书的正文形成的数据摘要,公钥内置在浏览器中用于解密获得数据摘要。这对密钥用于检测CA证书是否被修改。
第二组是服务器的非对称密钥。公钥用于加密浏览器的密钥,私钥则用于在服务端对传过来的浏览器的密钥进行解密进而获得用于解密密文的密钥。
第三组是浏览器的对称密钥。用于对在网络中传输的数据进行加密和解密。
八、如何成为中间人
在这里简单介绍两种成为中间人的方法。
1. ARP欺骗
在局域网中,黑客通过收到ARP Request广播包,能够偷听到其他节点的(IP、MAC)地址。例如黑客偷听到A和B两个主机的地址,于是黑客告诉B主机,自己是A主机,使得B主机发送给A主机的数据包都被黑客截取。
2. ICMP攻击
由于ICMP协议中有重定向的报文类型,那么我们就可以伪造一个ICMP信息然后发送给局域网中的客户端,并伪装自己是一个优先级更高的路由通路,从而导致目标所有的上网流量都会发送到我们指定的接口上,达到和ARP欺骗同样的效果。
当然,还有很多方式可以成为中间人,例如使用假wifi,创建假网站等等,这里就不再介绍了。