在上一篇博文中我们讲到了http协议,发现http协议传输的所有内容就是明文的,那么如果存在中间人在客户端和服务端之间的话,中间人是完全可以看到客户端和服务端之间的传输报文内容的,甚至可以篡改内容,所以就出现了https协议。
https协议是在http协议的基础上引入了一个加密层。
加密:就是指把明文(要传输的信息)经过一系列的变化,生成密文
解密:就是把密文再经过一系列的变化,还原成明文
举个例子:假设我们想要传递一个变量a里面的值,那么如果直接传输明文,就会出现泄露的风险,所以这个时候我们使用另一个变量key,将
key ^ a的值传输过去,中间人不知道这个key,所以就不会泄露,对方是有这个key的,所以对方拿到我们传输的结果再异或key,也就是key ^ a ^ key,那么最后的结果就还是a,就能够让对方拿到真实的结果。
这个过程就类似加密和解密的过程,其中的key就是密钥。当然真实的加密和解密不会有这么简单。
采用单钥密码系统的加密方法,同一密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密
就像我们最开始举的例子:把原文异或上key作为密文,在使用key异或密文获取原文的过程就是使用对称加密的方式进行加密和解密
非对称加密需要两个密钥来进行加密和解密:两个密钥分别是公开密钥(public key,公钥)和私有密钥(private key,私钥)
常见非对称加密算法(了解):RSA,DSA,ECDSA
非对称加密的特征:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,⽽使得加密解密速度没有对称加密解密的速度快。 公钥和私钥是配对的. 最⼤的缺点就是运算速度非常慢,比对称加密要慢很多。公钥可以认为是一把锁,私钥是锁的钥匙,锁给谁都行,但是只有持有私钥的人才能打开。
通过公钥对明文进行加密,形成密文
通过私钥对密文进行解密,得到明文
当然也可以反着用,通过私钥加密公钥解密
数字指纹(数据摘要),其基本原理是利⽤单向散列函数(Hash函数)对信息进⾏运算,⽣成⼀串固定⻓度的数字摘要。数字指纹并不是⼀种加密机制,但可以⽤来判断数据有没有被窜改,如果对数据某个地方进行小小的改动,重新生成的哈希摘要也和改动前的大不一样。
摘要常见算法:有MD5、SHA1、SHA256、SHA512等,算法把⽆限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)
摘要特征:和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行前后数据的对比,观察数据是否被修改过,也可以用于实现网盘的秒传功能、公司数据库密码存储等。
涉及到用户密码的字段,都是要加密的。一般数据库中的密码字段,长度是固定的(便于设计表结构),会将用户密码生成哈希摘要。每次用户登录时都将转换成哈希摘要与数据库的哈希摘要进行对比,所以数据库泄露也不怕
在网络通信过程中,我们需要解决的问题就是(1. 数据被监听; 2. 数据被篡改),针对这个问题,我们提出了解决方法,当然解决方法可能是有问题的,所以接下来就通过提出问题->解决问题的方式来讲解
如果在通信之前通信双方约定了一个密钥,在通信的时候使用密钥把明文首先加密称为密文,然后再发送密文,这种方式就能够实现加密通信(除非密钥被破解)。

但是一台服务器将来可能面对多个客户端,为了区分每个客户端的不同,所以每个客户端的密钥肯定得不一样。那么服务器怎么知道每个客户端的密钥分别是什么?所以提出的解决方案就是让每个客户端和服务端通信的时候会重新创建一个单独的密钥
但是如果只使用对称加密,就没有办法解决让密钥如何让对方安全的收到的问题。
非对称加密既可以使用公钥加密,也可以使用私钥加密。但是使用公钥加密必须使用私钥解密,使用私钥加密必须使用公钥解密。
考虑到非对称加密的机制,如果服务器先把公钥以明文的方式传输给浏览器,之后浏览器向服务器发送的数据都是用这个公钥加密,然后再传输,这样发送的就是密文了,服务器收到使用公钥加密的密文之后使用私钥解密拿到明文,这样似乎就保证了浏览器到服务器的通信安全,那么反过来服务器到客户端呢?
这样似乎就解决问题了,但是依然还有两个问题
先解决效率问题:

但是上述的通信方式都会有一个共同的问题:如果再最开始的时候中间人就已经开始攻击了怎么办?
确实,在⽅案2/3/4中,客⼾端获取到公钥S之后,对客⼾端形成的对称秘钥X⽤服务端给客⼾端的公钥S进⾏加密,中间⼈即使窃取到了数据,此时中间⼈确实⽆法解出客⼾端形成的密钥X,因为只有服务器有私钥S’
但是中间⼈的攻击,如果在最开始握⼿协商的时候就进⾏了,那就不⼀定了,假设hacker已经成功成为中间⼈
上⾯的攻击⽅案,同样适⽤于⽅案2,⽅案3
问题本质出在哪⾥了呢?客户端无法确定收到的含有公钥的数据报⽂,就是目标服务器发送过来的!
服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等。客户端向服务器请求公钥时,服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如⾝份证,是服务端公钥的身份证明

这个证书可以理解成是⼀个结构化的字符串, ⾥⾯包含了以下信息:证书发布机构、证书有效期、公钥、证书所有者、签名等
申请证书的时候,需要在特定平台⽣成CSR,同时⽣成公钥和私钥。这对密钥就是用来在⽹络通信中进行明文加密以及数字签名时使用的。
其中公钥会随着CSR⽂件,⼀起发给CA进⾏权威认证,私钥服务端自己保留,后续用于通信使用(主要就是⽤来交换对称密钥)
数字签名

当服务端申请CA证书的时候,CA机构会对该服务端进⾏审核,并专⻔为该⽹站形成数字签名,过程如
下:
在客户端和服务器刚⼀建⽴连接的时候,服务器给客⼾端返回⼀个证书,证书包含了之前服务端的公钥,也包含了网站的身份信息

当客户端获取到这个证书之后,会对证书进行校验,包括
事实上我们在浏览器中是能看到的
中间人有没有可能篡改该证书?
中间人整个掉包证书?
所以最终HTTPS的加密流程如下:

涉及到的密钥
第⼀组(⾮对称加密):⽤于校验证书是否被篡改.服务器持有私钥(私钥在形成CSR⽂件与申请证书时获
得),客⼾端持有公钥(操作系统包含了可信任的CA认证机构有哪些,同时持有对应的公钥).服务器在客
⼾端请求是,返回携带签名的证书.客⼾端通过这个公钥进⾏证书验证,保证证书的合法性,进⼀步保
证证书中携带的服务端公钥权威性。
第⼆组(⾮对称加密):⽤于协商⽣成对称加密的密钥.客⼾端⽤收到的CA证书中的公钥(是可被信任的)
给随机⽣成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密密钥.
第三组(对称加密):客⼾端和服务器后续传输的数据都通过这个对称密钥加密解密.
本节完…
证,保证证书的合法性,进⼀步保
证证书中携带的服务端公钥权威性。
第⼆组(⾮对称加密):⽤于协商⽣成对称加密的密钥.客⼾端⽤收到的CA证书中的公钥(是可被信任的)
给随机⽣成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密密钥.
第三组(对称加密):客⼾端和服务器后续传输的数据都通过这个对称密钥加密解密.
本节完…