明文传输风险
我们知道HTTP是软件层的一种无状态长连接的协议,发送的数据报经过软件层直接传给传输层往下。这就导致一个风险,如果数据不加密,可能会有窃取、篡改的风险。
例如在浏览器里面下载东西,明明下载的是这个网站下的软件,但是点击下载就变成另一个网址了。这就是因为有中间商进行了数据的拦截监听和篡改。
因此这是十分不安全的,那么我们就需要对数据进行加密等一系列操作,不要让中间人知道数据究竟是什么,并且就算中间人修改了数据,我们自己也要有所察觉
加密方式
对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密,特征:加密和解密所用的密钥是相同的
常见对称加密算法(了解):DES、3DES、AES、TDEA、Blowfish、RC2等
特点:算法公开、计算量小、加密速度快、加密效率高
非对称加密
需要用两个密钥来完成,一个是公开密钥,一个是私有密钥
常见的有算法有:RSA,DSA,ECDSA
特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。
非对称加密要用到两个密钥,一个叫做"公钥",一个叫做"私钥"
公钥和私钥是配对的.最大的缺点就是运算速度非常慢,比对称加密要慢很多。
通过公钥对明文加密,变成密文
通过私钥对密文解密,变成明文
也可以反着用
通过私钥对明文加密,变成密文
通过公钥对密文解密,变成明文
这里涉及到数学的相关知识,我们只要知道是什么即可
数据摘要&数据指纹
数据摘要和数据指纹是一个东西
数据摘要意思就是利用哈希映射函数对信息进行运算,生成一串固定长度的字符串。这个并不是用来加密的,而是用来判断数据是否被篡改
因为只要有一点数据的修改,对于哈希映射后的数字来说变化都是极大的
摘要常见算法:有MD5、SHA1、SHA256、SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)
HTTPS工作流程
HTTPS就是在HTTP和传输层之间加一层软件层,这一层将数据进行加密,保证数据的相对安全。通常使用TLS或者SSL等方式,因此和HTTP统称交HTTPS
方案一:只使用对称密钥
双方都使用同一个密钥,但此时有个问题,双方得都需要持有密钥,就需要通信将密钥发送给对方。那么此时黑客可以直接把密钥拿到手,密文也就变成明文了

方案二:只使用非对称加密
非对称就是如下原理

原理是服务器持有公钥和私钥,并在TCP连接的时候将公钥发送给客户端,此时客户端需要用公钥加密发送给服务器,服务器私钥不会发送到网络里面,客户端发来的数据就不会被窃取,但是服务器的数据是私钥加密的,需要公钥解密,公钥可能开始被窃取,导致服务器到客户端的数据被窃取篡改
总之,从左向右可能是安全的,从右往左是不安全的。并且运算速度慢,通信效率低
但其实从左往右也不是安全的,我们下面说。
方案三:双方都使用非对称加密

这里不多说了
还是两个问题,一是并不安全,而是速度更加慢了
方案四:非对称加密+对称加密

服务器发送公钥S,客户端获得公钥S,然后客户端创建一个公钥C并将公钥C发送给服务器此时使用公钥S加密。此时因为私钥S在服务器,是得不到公钥C的,那么此时只有服务器能得到公钥C。这样后面的通信就可以用公钥C来实现了。
这样可以解决速度慢的问题,同时保证了一定的安全性。
但是看着方案二三四都蛮安全的,其实一点都不安全
中间人攻击

我们拿方案四来看,服务器发送公钥S,中间人获取S,然后发送给客户端一个公钥M,自己拿着私钥M,客户端将用公钥M加密的公钥C发回,中间人用私钥解密获取公钥C,在用公钥S加密后发送给服务器,这样双方不知道有中间人,中间人也知道公钥C是什么。所以又有安全问题了。
签名
我们在上面学到了数据摘要,那么

数据通过一个私钥进行加密形成的散列值就叫做签名,因为这个签名是私钥加密的,只有一个机构有,那么就具有了权威性。我们可以将这个数据进行重新散列函数求值,然后用公钥进行解密(私钥用公钥解),这样就能拿签名的哈希值和自己散列的哈希值进行对比,如果出错说明数据被修改了。中间人如果要修改数据不行,如果想同时修改数据和散列值也不行,因为散列值加密你没有私钥。因此单独修改或者整体替换都是不能的。
CA 证书
有一些公司是专门颁发证书的,正式就像身份证,具有权威性

当一个服务器要支持HTTPS,此时服务器自身会生成一个私钥S和公钥S。将这个公钥S和相关的明文信息,例如域名、证书时间、公钥S、签发机构等组成的CSR交给CA机构。此时就会将这个明文信息进行签名,然后生成的就是证书。


CA机构公钥会部署在浏览器等地方,方便进行对证书的验证 。我们可以在浏览器里面看到

我们知道方案四的缺点就是怕数据被修改和窃取,那么证书就可以直接解决这一点
为什么不将证书整个加密呢?因为没必要,这些数据不是私密的,证书信息本来就是公开的
方案五:非对称加密+证书+对称加密
当客户端连接的时候,此时服务端会将证书进行返回,原本返回的就是一个公钥S,是能被修改掉包的。此时如果传的是证书,虽然是明文的,且中间人有公钥,但是它只能解密数据摘要,但是无法修改,因为没有CA的私钥重新加密,后续再次解密就会出错被发现是修改的数据;数据也无法修改,因为如果篡改了,最后两者的数据摘要不同,也会出错。所以无法被修改。那么到手到客户端的证书只要是验证成功的一定是没被修改的。
那么此时客户端拿到了证书,就能安全读取未修改的公钥S,将要后续进行对称加密通信的对称密钥C信息用公钥S加密发送回服务端,此时中间人也无法成功修改和窃取,因为需要用私钥S来解密,私钥S只有服务端才有,那么服务端拿到数据就能获取对称密钥C,这个C只有客户端和服务端知道,就能后续安全的进行对称加密通信了。
这样既解决了安全问题,又解决了通信效率的问题。