HTTPS与HTTP一样都是应用层协议,与HTTPS不同的是:HTTP的协议内容都是按照文本方式进行明文传输的,这导致在传输过程第三方者能够轻易获取传输的内容,而HTTPS在HTTP协议基础上引入一个加密以防止传输内容泄露或被篡改。
加密就是将明文(要传输的信息)按照指定的方式进行变换,生成密文. 解密就是将密文按照指定的方式进行变换,还原成明文.
在加密和解密的过程中,一般需要一个或多个中间转换的数据,来辅助这过程的正常进行,这个数据就被叫做密钥.
作用:就是防止他人获取其中的明文,窃取信息继而造成隐患.
像我们这些学编程的,对于"加密"这一词,倒是听说过,就从按位异或来讲.
a ^ b = c
c ^ b = a
//10 ^ 12 = 6
//6 ^ 12 = 10
我们可以发现,此时我们的 b 就是一把密钥,通过这个钥匙,可以给 a 加密变成 c ,也可以给 c 解密变成 a.
对称加密其实就是通过一个"密钥",把明文加密成密文,并且把密文解密成明文.
上面举得例子就是,加密和解密用的都是同一个密钥.
画个图大家就好理解了…
假设盒子里的内容就是要传递的信息,那么为了保证这个信息不泄露,我们需要对盒子加密.只有拥有密钥的才可以查看明文.
假设这个是服务器要发给客户端的.那么当,客户端和服务器都拥有这把密钥之后,他们之间进行信息的传输就是安全的.
怎么才能做到客户端和服务器都有这把钥匙呢?此时就需要通过网络将这把钥匙的模板传过去.
但是这个密钥是通过网络途径传输过去的,有可能会被黑客截胡,那么这个黑客不就也拿到了这个密钥嘛?
对称加密里最关键的就是密钥,客户端和服务器需要先约定好密钥是什么,如果客户端生成了密钥,就需要通过网络告知服务器密钥是什么,由于密钥本身也会在网络上明文传输,一旦被黑客截获,那么后续对数据的加密也就失去了意义.
因此密钥的传输也必须加密,即指定一个"密钥的密钥",也就是下面讲的非对称加密.
给大家讲个游戏规则:
我们可以:
通过上面的这个小游戏,我们可以理解为:
信封就是对称密钥,钥匙A,B就是非对称密钥,我们需要通过非对称密钥来完成将对称密钥安全的送到对方手里的这个任务.
下面是正式的讲解:
非对称加密要用到两个密钥,一个叫公钥,另一个叫做私钥.(公钥和私钥是成对出现的,公钥用于加锁,私钥用于解锁)
通过公钥对明文进行加密,变成密文:然后通过私钥对密文进行解密,变成明文,也可以反着用.
公钥和私钥是配对的,最大的缺点就是运算速度非常慢,比对称加密慢好多.
我们引入非对称加密,来对自己的对称密钥进行加密:
注意:
由于对称加密的成本是比较低的,即机器资源消耗量是比较小的,速度也比较快,因此我们传输数据时会先利用非对称加密方式将对称密钥进行加密,然后使用对称密钥再对数据进行加密.
还不清楚的话.大家看下面的一个图:
此时的黑客,即使截获到了这个传输的数据,也无法拿到对称加密的密钥.
可能你认为上面的操作已经足够安全了…
NONONO!!!
假如我在截取到你的数据后,将你的数据篡改,阁下该如何应对?
上图就是关于中间人攻击的一个介绍,实质上就是黑客在中间充当一个双面客. 服务器将公钥pub1发送过来,黑客中间劫持,并且自己生成了一对非对称密钥,将自己生成的pub2发送给客户端,但是由于客户端不知道发来的pub2是不是服务器的公钥,因此就上当了.将对称密钥通过pub2进行加密,发送给黑客,然后黑客将pub2加密的对称密钥进行解密,拿到客户端的对称密钥,再将自己的对称密钥通过pub1进行加密,发送给服务器.由于服务器也不知道这个加密过的对称密钥是不是客户端发送来的,因此就使用这个对称密钥进行后续的加密了.
从上述过程来说,客户端无法判断公钥的真假造成的。如果客户端可以辨别公钥的真假,那么这个中间人攻击也就迎刃而解了!
为了解决上述问题,人们就想出来了"证书"这个方法.就是一些服务器(网站)在成立的时候,需要去一些专门的认证机构(第三方机构)申请证书.服务器需要提供一些资质,当申请通过后,机构就会给你颁发一个证书.其中,证书中也就包含了公钥.此时客户端申请公钥的时候,就不应该只是请求一个公钥了,而是请求要一个证书.当客户端拿到证书后,就可以进行校验,验证证书是不是假的或者被篡改过的.如果客户端发现证书是无效的,浏览器就会直接弹出警告…
查看证书的过程:
我们可以看到上面有一个字段是指纹.其实这个指纹里面存的内容就是将上面整体的字段通过签名算法求出签名,再根据证书提供的公钥,来进行加密的密文.
证明机构本身是非对称加密的,上面的指纹就是通过证明机构的公钥进行加密,证明机构的私钥会在客户端下载这个安全证书后自带.
那么这个证书给密文加密后,我这里也没有密钥,该怎么解析呢?
其实不然,因为我们的系统中会自带一些证书的密钥,用于解析密文,又因为是自带的,不需要通过网络的传输,所以不用担心这个密钥被获取.
此时大概的流程我们可以画图参考一下:
注意,认证机构是有一对非对称密钥的。私钥用来加密hash值就得到了签名。公钥给客户端就可以解密签名获得hash值了。